blob: 890604821c23fd83ead078667d7f50830ec81a2c [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"
3889 " 7. Framebuffer attachment w/o identity swizzle\n"
3890 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003891
Tony Barbour1fa09702017-03-16 12:09:08 -06003892 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003893 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3894
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003895 m_errorMonitor->SetDesiredFailureMsg(
3896 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3897 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003898
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003899 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003900 VkAttachmentReference attach = {};
3901 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3902 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003903 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003904 VkRenderPassCreateInfo rpci = {};
3905 rpci.subpassCount = 1;
3906 rpci.pSubpasses = &subpass;
3907 rpci.attachmentCount = 1;
3908 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003909 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003910 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003911 rpci.pAttachments = &attach_desc;
3912 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3913 VkRenderPass rp;
3914 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3915 ASSERT_VK_SUCCESS(err);
3916
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003917 VkImageView ivs[2];
3918 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3919 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003920 VkFramebufferCreateInfo fb_info = {};
3921 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3922 fb_info.pNext = NULL;
3923 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003924 // Set mis-matching attachmentCount
3925 fb_info.attachmentCount = 2;
3926 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003927 fb_info.width = 100;
3928 fb_info.height = 100;
3929 fb_info.layers = 1;
3930
3931 VkFramebuffer fb;
3932 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3933
3934 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003935 if (err == VK_SUCCESS) {
3936 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3937 }
3938 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003939
3940 // Create a renderPass with a depth-stencil attachment created with
3941 // IMAGE_USAGE_COLOR_ATTACHMENT
3942 // Add our color attachment to pDepthStencilAttachment
3943 subpass.pDepthStencilAttachment = &attach;
3944 subpass.pColorAttachments = NULL;
3945 VkRenderPass rp_ds;
3946 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3947 ASSERT_VK_SUCCESS(err);
3948 // Set correct attachment count, but attachment has COLOR usage bit set
3949 fb_info.attachmentCount = 1;
3950 fb_info.renderPass = rp_ds;
3951
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003953 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3954
3955 m_errorMonitor->VerifyFound();
3956 if (err == VK_SUCCESS) {
3957 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3958 }
3959 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003960
3961 // Create new renderpass with alternate attachment format from fb
3962 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3963 subpass.pDepthStencilAttachment = NULL;
3964 subpass.pColorAttachments = &attach;
3965 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3966 ASSERT_VK_SUCCESS(err);
3967
3968 // Cause error due to mis-matched formats between rp & fb
3969 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3970 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3972 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003973 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3974
3975 m_errorMonitor->VerifyFound();
3976 if (err == VK_SUCCESS) {
3977 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3978 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003979 vkDestroyRenderPass(m_device->device(), rp, NULL);
3980
3981 // Create new renderpass with alternate sample count from fb
3982 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3983 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3984 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3985 ASSERT_VK_SUCCESS(err);
3986
3987 // Cause error due to mis-matched sample count between rp & fb
3988 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003990 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003991 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3992
3993 m_errorMonitor->VerifyFound();
3994 if (err == VK_SUCCESS) {
3995 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3996 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003997
3998 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003999
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004000 {
4001 // Create an image with 2 mip levels.
4002 VkImageObj image(m_device);
4003 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4004 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004005
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004006 // Create a image view with two mip levels.
4007 VkImageView view;
4008 VkImageViewCreateInfo ivci = {};
4009 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4010 ivci.image = image.handle();
4011 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4012 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4013 ivci.subresourceRange.layerCount = 1;
4014 ivci.subresourceRange.baseMipLevel = 0;
4015 // Set level count to 2 (only 1 is allowed for FB attachment)
4016 ivci.subresourceRange.levelCount = 2;
4017 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4018 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4019 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004020
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004021 // Re-create renderpass to have matching sample count
4022 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4023 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4024 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004025
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004026 fb_info.renderPass = rp;
4027 fb_info.pAttachments = &view;
4028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
4029 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4030
4031 m_errorMonitor->VerifyFound();
4032 if (err == VK_SUCCESS) {
4033 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4034 }
4035 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004036 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004037
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004038 // Update view to original color buffer and grow FB dimensions too big
4039 fb_info.pAttachments = ivs;
4040 fb_info.height = 1024;
4041 fb_info.width = 1024;
4042 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004044 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4045
4046 m_errorMonitor->VerifyFound();
4047 if (err == VK_SUCCESS) {
4048 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4049 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004050
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004051 {
4052 // Create an image with one mip level.
4053 VkImageObj image(m_device);
4054 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4055 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004056
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004057 // Create view attachment with non-identity swizzle
4058 VkImageView view;
4059 VkImageViewCreateInfo ivci = {};
4060 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4061 ivci.image = image.handle();
4062 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4063 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4064 ivci.subresourceRange.layerCount = 1;
4065 ivci.subresourceRange.baseMipLevel = 0;
4066 ivci.subresourceRange.levelCount = 1;
4067 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4068 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4069 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4070 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4071 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4072 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4073 ASSERT_VK_SUCCESS(err);
4074
4075 fb_info.pAttachments = &view;
4076 fb_info.height = 100;
4077 fb_info.width = 100;
4078 fb_info.layers = 1;
4079
4080 m_errorMonitor->SetDesiredFailureMsg(
4081 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4082 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
4083 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4084
4085 m_errorMonitor->VerifyFound();
4086 if (err == VK_SUCCESS) {
4087 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4088 }
4089 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004090 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004091
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004092 // reset attachment to color attachment
4093 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004094
4095 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004096 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004097 fb_info.height = 100;
4098 fb_info.layers = 1;
4099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004100 m_errorMonitor->SetDesiredFailureMsg(
4101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004102 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4103 "Here are the respective dimensions for attachment");
4104
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004105 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4106
4107 m_errorMonitor->VerifyFound();
4108 if (err == VK_SUCCESS) {
4109 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4110 }
4111
4112 // Request fb that exceeds max height
4113 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004114 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004115 fb_info.layers = 1;
4116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004117 m_errorMonitor->SetDesiredFailureMsg(
4118 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004119 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4120 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004121 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4122
4123 m_errorMonitor->VerifyFound();
4124 if (err == VK_SUCCESS) {
4125 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4126 }
4127
4128 // Request fb that exceeds max layers
4129 fb_info.width = 100;
4130 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004131 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004133 m_errorMonitor->SetDesiredFailureMsg(
4134 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004135 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4136 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004137 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4138
4139 m_errorMonitor->VerifyFound();
4140 if (err == VK_SUCCESS) {
4141 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4142 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004143
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004144 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004145}
4146
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004147TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004148 TEST_DESCRIPTION(
4149 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4150 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004151
Tony Barbour1fa09702017-03-16 12:09:08 -06004152 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004153 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4155 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004156 m_errorMonitor->VerifyFound();
4157}
4158
4159TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004160 TEST_DESCRIPTION(
4161 "Run a simple draw calls to validate failure when Line Width dynamic "
4162 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004163
Tony Barbour1fa09702017-03-16 12:09:08 -06004164 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004165 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4167 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004168 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004169}
4170
4171TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004172 TEST_DESCRIPTION(
4173 "Run a simple draw calls to validate failure when Viewport dynamic "
4174 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004175
Tony Barbour1fa09702017-03-16 12:09:08 -06004176 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004177 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4179 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004180 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004181 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004182}
4183
4184TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004185 TEST_DESCRIPTION(
4186 "Run a simple draw calls to validate failure when Scissor dynamic "
4187 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004188
Tony Barbour1fa09702017-03-16 12:09:08 -06004189 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004190 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4192 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004193 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004194 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004195}
4196
Cortd713fe82016-07-27 09:51:27 -07004197TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004198 TEST_DESCRIPTION(
4199 "Run a simple draw calls to validate failure when Blend Constants "
4200 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004201
Tony Barbour1fa09702017-03-16 12:09:08 -06004202 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004203 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4205 "Dynamic blend constants state not set for this command buffer");
4206 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004207 m_errorMonitor->VerifyFound();
4208}
4209
4210TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004211 TEST_DESCRIPTION(
4212 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4213 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004214
Tony Barbour1fa09702017-03-16 12:09:08 -06004215 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004216 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004217 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004218 return;
4219 }
4220 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4222 "Dynamic depth bounds state not set for this command buffer");
4223 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004224 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004225}
4226
4227TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004228 TEST_DESCRIPTION(
4229 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4230 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004231
Tony Barbour1fa09702017-03-16 12:09:08 -06004232 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004233 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Dynamic stencil read mask state not set for this command buffer");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004237 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004238}
4239
4240TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004241 TEST_DESCRIPTION(
4242 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4243 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004246 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4248 "Dynamic stencil write mask state not set for this command buffer");
4249 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004250 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004251}
4252
4253TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004254 TEST_DESCRIPTION(
4255 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4256 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004257
Tony Barbour1fa09702017-03-16 12:09:08 -06004258 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004259 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4261 "Dynamic stencil reference state not set for this command buffer");
4262 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004263 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004264}
4265
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004266TEST_F(VkLayerTest, IndexBufferNotBound) {
4267 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004268
Tony Barbour1fa09702017-03-16 12:09:08 -06004269 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4271 "Index buffer object not bound to this command buffer when Indexed ");
4272 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004273 m_errorMonitor->VerifyFound();
4274}
4275
Karl Schultz6addd812016-02-02 17:17:23 -07004276TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4278 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4279 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004280
Tony Barbour1fa09702017-03-16 12:09:08 -06004281 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004282 ASSERT_NO_FATAL_FAILURE(InitViewport());
4283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4284
Karl Schultz6addd812016-02-02 17:17:23 -07004285 // We luck out b/c by default the framework creates CB w/ the
4286 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004287 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004288 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004289 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004290
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004291 // Bypass framework since it does the waits automatically
4292 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004293 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004294 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4295 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004296 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004297 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004298 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004299 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004300 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004301 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004302 submit_info.pSignalSemaphores = NULL;
4303
Chris Forbes40028e22016-06-13 09:59:34 +12004304 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004305 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004306 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004307
Karl Schultz6addd812016-02-02 17:17:23 -07004308 // Cause validation error by re-submitting cmd buffer that should only be
4309 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004310 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004311 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004312
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004313 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004314}
4315
Karl Schultz6addd812016-02-02 17:17:23 -07004316TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004317 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004318 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004319
Tony Barbour1fa09702017-03-16 12:09:08 -06004320 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004321 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004322
Karl Schultz6addd812016-02-02 17:17:23 -07004323 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4324 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004325 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004326 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004327 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004328
4329 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004330 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4331 ds_pool_ci.pNext = NULL;
4332 ds_pool_ci.flags = 0;
4333 ds_pool_ci.maxSets = 1;
4334 ds_pool_ci.poolSizeCount = 1;
4335 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336
4337 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004338 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004339 ASSERT_VK_SUCCESS(err);
4340
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004341 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4342 dsl_binding_samp.binding = 0;
4343 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4344 dsl_binding_samp.descriptorCount = 1;
4345 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4346 dsl_binding_samp.pImmutableSamplers = NULL;
4347
4348 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4349 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4350 ds_layout_ci.pNext = NULL;
4351 ds_layout_ci.bindingCount = 1;
4352 ds_layout_ci.pBindings = &dsl_binding_samp;
4353
4354 VkDescriptorSetLayout ds_layout_samp;
4355 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4356 ASSERT_VK_SUCCESS(err);
4357
4358 // Try to allocate 2 sets when pool only has 1 set
4359 VkDescriptorSet descriptor_sets[2];
4360 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4361 VkDescriptorSetAllocateInfo alloc_info = {};
4362 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4363 alloc_info.descriptorSetCount = 2;
4364 alloc_info.descriptorPool = ds_pool;
4365 alloc_info.pSetLayouts = set_layouts;
4366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4367 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4368 m_errorMonitor->VerifyFound();
4369
4370 alloc_info.descriptorSetCount = 1;
4371 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004372 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004373 dsl_binding.binding = 0;
4374 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4375 dsl_binding.descriptorCount = 1;
4376 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4377 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004378
Karl Schultz6addd812016-02-02 17:17:23 -07004379 ds_layout_ci.bindingCount = 1;
4380 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004381
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004382 VkDescriptorSetLayout ds_layout_ub;
4383 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004384 ASSERT_VK_SUCCESS(err);
4385
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004386 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004387 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004388 alloc_info.pSetLayouts = &ds_layout_ub;
4389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4390 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004392 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004393
Karl Schultz2825ab92016-12-02 08:23:14 -07004394 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004395 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004396 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004397}
4398
Karl Schultz6addd812016-02-02 17:17:23 -07004399TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4400 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004403
Tony Barbour1fa09702017-03-16 12:09:08 -06004404 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004406
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004407 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004408 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4409 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004410
4411 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004412 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4413 ds_pool_ci.pNext = NULL;
4414 ds_pool_ci.maxSets = 1;
4415 ds_pool_ci.poolSizeCount = 1;
4416 ds_pool_ci.flags = 0;
4417 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4418 // app can only call vkResetDescriptorPool on this pool.;
4419 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004420
4421 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004422 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004423 ASSERT_VK_SUCCESS(err);
4424
4425 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004426 dsl_binding.binding = 0;
4427 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4428 dsl_binding.descriptorCount = 1;
4429 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4430 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004431
4432 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004433 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4434 ds_layout_ci.pNext = NULL;
4435 ds_layout_ci.bindingCount = 1;
4436 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004437
4438 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004439 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004440 ASSERT_VK_SUCCESS(err);
4441
4442 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004443 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004444 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004445 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004446 alloc_info.descriptorPool = ds_pool;
4447 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004448 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004449 ASSERT_VK_SUCCESS(err);
4450
4451 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004452 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004453
Chia-I Wuf7458c52015-10-26 21:10:41 +08004454 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4455 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004456}
4457
Karl Schultz6addd812016-02-02 17:17:23 -07004458TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004459 // Attempt to clear Descriptor Pool with bad object.
4460 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004461
Tony Barbour1fa09702017-03-16 12:09:08 -06004462 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004464 uint64_t fake_pool_handle = 0xbaad6001;
4465 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4466 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004467 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004468}
4469
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004470TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004471 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4472 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004473 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004474 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004475
4476 uint64_t fake_set_handle = 0xbaad6001;
4477 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004478 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004480
Tony Barbour1fa09702017-03-16 12:09:08 -06004481 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004482
4483 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4484 layout_bindings[0].binding = 0;
4485 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4486 layout_bindings[0].descriptorCount = 1;
4487 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4488 layout_bindings[0].pImmutableSamplers = NULL;
4489
4490 VkDescriptorSetLayout descriptor_set_layout;
4491 VkDescriptorSetLayoutCreateInfo dslci = {};
4492 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4493 dslci.pNext = NULL;
4494 dslci.bindingCount = 1;
4495 dslci.pBindings = layout_bindings;
4496 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004497 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004498
4499 VkPipelineLayout pipeline_layout;
4500 VkPipelineLayoutCreateInfo plci = {};
4501 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4502 plci.pNext = NULL;
4503 plci.setLayoutCount = 1;
4504 plci.pSetLayouts = &descriptor_set_layout;
4505 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004506 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004507
Tony Barbour552f6c02016-12-21 14:34:07 -07004508 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004509 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4510 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004511 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004512 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004513 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4514 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004515}
4516
Karl Schultz6addd812016-02-02 17:17:23 -07004517TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004518 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4519 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004520 uint64_t fake_layout_handle = 0xbaad6001;
4521 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004523 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004524 VkPipelineLayout pipeline_layout;
4525 VkPipelineLayoutCreateInfo plci = {};
4526 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4527 plci.pNext = NULL;
4528 plci.setLayoutCount = 1;
4529 plci.pSetLayouts = &bad_layout;
4530 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4531
4532 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004533}
4534
Mark Muellerd4914412016-06-13 17:52:06 -06004535TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004536 TEST_DESCRIPTION(
4537 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4538 "1) A uniform buffer update must have a valid buffer index."
4539 "2) When using an array of descriptors in a single WriteDescriptor,"
4540 " the descriptor types and stageflags must all be the same."
4541 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004542
Mike Weiblena6666382017-01-05 15:16:11 -07004543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004544
Tony Barbour1fa09702017-03-16 12:09:08 -06004545 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004546 VkDescriptorPoolSize ds_type_count[4] = {};
4547 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4548 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004549 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004550 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004551 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004552 ds_type_count[2].descriptorCount = 1;
4553 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4554 ds_type_count[3].descriptorCount = 1;
4555
4556 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4557 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4558 ds_pool_ci.maxSets = 1;
4559 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4560 ds_pool_ci.pPoolSizes = ds_type_count;
4561
4562 VkDescriptorPool ds_pool;
4563 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4564 ASSERT_VK_SUCCESS(err);
4565
Mark Muellerb9896722016-06-16 09:54:29 -06004566 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004567 layout_binding[0].binding = 0;
4568 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4569 layout_binding[0].descriptorCount = 1;
4570 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4571 layout_binding[0].pImmutableSamplers = NULL;
4572
4573 layout_binding[1].binding = 1;
4574 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4575 layout_binding[1].descriptorCount = 1;
4576 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4577 layout_binding[1].pImmutableSamplers = NULL;
4578
4579 VkSamplerCreateInfo sampler_ci = {};
4580 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4581 sampler_ci.pNext = NULL;
4582 sampler_ci.magFilter = VK_FILTER_NEAREST;
4583 sampler_ci.minFilter = VK_FILTER_NEAREST;
4584 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4585 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4586 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4587 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4588 sampler_ci.mipLodBias = 1.0;
4589 sampler_ci.anisotropyEnable = VK_FALSE;
4590 sampler_ci.maxAnisotropy = 1;
4591 sampler_ci.compareEnable = VK_FALSE;
4592 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4593 sampler_ci.minLod = 1.0;
4594 sampler_ci.maxLod = 1.0;
4595 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4596 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4597 VkSampler sampler;
4598
4599 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4600 ASSERT_VK_SUCCESS(err);
4601
4602 layout_binding[2].binding = 2;
4603 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4604 layout_binding[2].descriptorCount = 1;
4605 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4606 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4607
Mark Muellerd4914412016-06-13 17:52:06 -06004608 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4609 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4610 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4611 ds_layout_ci.pBindings = layout_binding;
4612 VkDescriptorSetLayout ds_layout;
4613 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4614 ASSERT_VK_SUCCESS(err);
4615
4616 VkDescriptorSetAllocateInfo alloc_info = {};
4617 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4618 alloc_info.descriptorSetCount = 1;
4619 alloc_info.descriptorPool = ds_pool;
4620 alloc_info.pSetLayouts = &ds_layout;
4621 VkDescriptorSet descriptorSet;
4622 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4623 ASSERT_VK_SUCCESS(err);
4624
4625 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4626 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4627 pipeline_layout_ci.pNext = NULL;
4628 pipeline_layout_ci.setLayoutCount = 1;
4629 pipeline_layout_ci.pSetLayouts = &ds_layout;
4630
4631 VkPipelineLayout pipeline_layout;
4632 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4633 ASSERT_VK_SUCCESS(err);
4634
Mark Mueller5c838ce2016-06-16 09:54:29 -06004635 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004636 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4637 descriptor_write.dstSet = descriptorSet;
4638 descriptor_write.dstBinding = 0;
4639 descriptor_write.descriptorCount = 1;
4640 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4641
Mark Mueller5c838ce2016-06-16 09:54:29 -06004642 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004643 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4644 m_errorMonitor->VerifyFound();
4645
4646 // Create a buffer to update the descriptor with
4647 uint32_t qfi = 0;
4648 VkBufferCreateInfo buffCI = {};
4649 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4650 buffCI.size = 1024;
4651 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4652 buffCI.queueFamilyIndexCount = 1;
4653 buffCI.pQueueFamilyIndices = &qfi;
4654
4655 VkBuffer dyub;
4656 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4657 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004658
Tony Barboure132c5f2016-12-12 11:50:20 -07004659 VkDeviceMemory mem;
4660 VkMemoryRequirements mem_reqs;
4661 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4662
4663 VkMemoryAllocateInfo mem_alloc_info = {};
4664 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4665 mem_alloc_info.allocationSize = mem_reqs.size;
4666 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4667 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4668 ASSERT_VK_SUCCESS(err);
4669
4670 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4671 ASSERT_VK_SUCCESS(err);
4672
4673 VkDescriptorBufferInfo buffInfo[2] = {};
4674 buffInfo[0].buffer = dyub;
4675 buffInfo[0].offset = 0;
4676 buffInfo[0].range = 1024;
4677 buffInfo[1].buffer = dyub;
4678 buffInfo[1].offset = 0;
4679 buffInfo[1].range = 1024;
4680 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004681 descriptor_write.descriptorCount = 2;
4682
Mark Mueller5c838ce2016-06-16 09:54:29 -06004683 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004685 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4686 m_errorMonitor->VerifyFound();
4687
Mark Mueller5c838ce2016-06-16 09:54:29 -06004688 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4689 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004690 descriptor_write.dstBinding = 1;
4691 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004692
Mark Mueller5c838ce2016-06-16 09:54:29 -06004693 // Make pImageInfo index non-null to avoid complaints of it missing
4694 VkDescriptorImageInfo imageInfo = {};
4695 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4696 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004698 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4699 m_errorMonitor->VerifyFound();
4700
Mark Muellerd4914412016-06-13 17:52:06 -06004701 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004702 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004703 vkDestroySampler(m_device->device(), sampler, NULL);
4704 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4705 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4706 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4707}
4708
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004709TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004710 TEST_DESCRIPTION(
4711 "Attempt to draw with a command buffer that is invalid "
4712 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004713 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004714
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004715 VkBuffer buffer;
4716 VkDeviceMemory mem;
4717 VkMemoryRequirements mem_reqs;
4718
4719 VkBufferCreateInfo buf_info = {};
4720 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004721 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004722 buf_info.size = 256;
4723 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4724 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4725 ASSERT_VK_SUCCESS(err);
4726
4727 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4728
4729 VkMemoryAllocateInfo alloc_info = {};
4730 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4731 alloc_info.allocationSize = 256;
4732 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004733 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 -06004734 if (!pass) {
4735 vkDestroyBuffer(m_device->device(), buffer, NULL);
4736 return;
4737 }
4738 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4739 ASSERT_VK_SUCCESS(err);
4740
4741 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4742 ASSERT_VK_SUCCESS(err);
4743
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004744 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004745 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004746 m_commandBuffer->EndCommandBuffer();
4747
Mark Lobodzinski33826372017-04-13 11:10:11 -06004748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004749 // Destroy buffer dependency prior to submit to cause ERROR
4750 vkDestroyBuffer(m_device->device(), buffer, NULL);
4751
4752 VkSubmitInfo submit_info = {};
4753 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4754 submit_info.commandBufferCount = 1;
4755 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4756 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4757
4758 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004759 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004760 vkFreeMemory(m_device->handle(), mem, NULL);
4761}
4762
Tobin Ehlisea413442016-09-28 10:23:59 -06004763TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4764 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4765
Tony Barbour1fa09702017-03-16 12:09:08 -06004766 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004767 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4768
4769 VkDescriptorPoolSize ds_type_count;
4770 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4771 ds_type_count.descriptorCount = 1;
4772
4773 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4774 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4775 ds_pool_ci.maxSets = 1;
4776 ds_pool_ci.poolSizeCount = 1;
4777 ds_pool_ci.pPoolSizes = &ds_type_count;
4778
4779 VkDescriptorPool ds_pool;
4780 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4781 ASSERT_VK_SUCCESS(err);
4782
4783 VkDescriptorSetLayoutBinding layout_binding;
4784 layout_binding.binding = 0;
4785 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4786 layout_binding.descriptorCount = 1;
4787 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4788 layout_binding.pImmutableSamplers = NULL;
4789
4790 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4791 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4792 ds_layout_ci.bindingCount = 1;
4793 ds_layout_ci.pBindings = &layout_binding;
4794 VkDescriptorSetLayout ds_layout;
4795 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4796 ASSERT_VK_SUCCESS(err);
4797
4798 VkDescriptorSetAllocateInfo alloc_info = {};
4799 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4800 alloc_info.descriptorSetCount = 1;
4801 alloc_info.descriptorPool = ds_pool;
4802 alloc_info.pSetLayouts = &ds_layout;
4803 VkDescriptorSet descriptor_set;
4804 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4805 ASSERT_VK_SUCCESS(err);
4806
4807 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4808 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4809 pipeline_layout_ci.pNext = NULL;
4810 pipeline_layout_ci.setLayoutCount = 1;
4811 pipeline_layout_ci.pSetLayouts = &ds_layout;
4812
4813 VkPipelineLayout pipeline_layout;
4814 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4815 ASSERT_VK_SUCCESS(err);
4816
4817 VkBuffer buffer;
4818 uint32_t queue_family_index = 0;
4819 VkBufferCreateInfo buffer_create_info = {};
4820 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4821 buffer_create_info.size = 1024;
4822 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4823 buffer_create_info.queueFamilyIndexCount = 1;
4824 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4825
4826 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4827 ASSERT_VK_SUCCESS(err);
4828
4829 VkMemoryRequirements memory_reqs;
4830 VkDeviceMemory buffer_memory;
4831
4832 VkMemoryAllocateInfo memory_info = {};
4833 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4834 memory_info.allocationSize = 0;
4835 memory_info.memoryTypeIndex = 0;
4836
4837 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4838 memory_info.allocationSize = memory_reqs.size;
4839 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4840 ASSERT_TRUE(pass);
4841
4842 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4843 ASSERT_VK_SUCCESS(err);
4844 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4845 ASSERT_VK_SUCCESS(err);
4846
4847 VkBufferView view;
4848 VkBufferViewCreateInfo bvci = {};
4849 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4850 bvci.buffer = buffer;
4851 bvci.format = VK_FORMAT_R8_UNORM;
4852 bvci.range = VK_WHOLE_SIZE;
4853
4854 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4855 ASSERT_VK_SUCCESS(err);
4856
4857 VkWriteDescriptorSet descriptor_write = {};
4858 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4859 descriptor_write.dstSet = descriptor_set;
4860 descriptor_write.dstBinding = 0;
4861 descriptor_write.descriptorCount = 1;
4862 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4863 descriptor_write.pTexelBufferView = &view;
4864
4865 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4866
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004867 char const *vsSource =
4868 "#version 450\n"
4869 "\n"
4870 "out gl_PerVertex { \n"
4871 " vec4 gl_Position;\n"
4872 "};\n"
4873 "void main(){\n"
4874 " gl_Position = vec4(1);\n"
4875 "}\n";
4876 char const *fsSource =
4877 "#version 450\n"
4878 "\n"
4879 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4880 "layout(location=0) out vec4 x;\n"
4881 "void main(){\n"
4882 " x = imageLoad(s, 0);\n"
4883 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004884 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4885 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4886 VkPipelineObj pipe(m_device);
4887 pipe.AddShader(&vs);
4888 pipe.AddShader(&fs);
4889 pipe.AddColorAttachment();
4890 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4891
Mark Lobodzinski33826372017-04-13 11:10:11 -06004892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004893
Tony Barbour552f6c02016-12-21 14:34:07 -07004894 m_commandBuffer->BeginCommandBuffer();
4895 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4896
Tobin Ehlisea413442016-09-28 10:23:59 -06004897 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4898 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4899 VkRect2D scissor = {{0, 0}, {16, 16}};
4900 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4901 // Bind pipeline to cmd buffer
4902 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4903 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4904 &descriptor_set, 0, nullptr);
4905 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004906 m_commandBuffer->EndRenderPass();
4907 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004908
4909 // Delete BufferView in order to invalidate cmd buffer
4910 vkDestroyBufferView(m_device->device(), view, NULL);
4911 // Now attempt submit of cmd buffer
4912 VkSubmitInfo submit_info = {};
4913 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4914 submit_info.commandBufferCount = 1;
4915 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4916 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4917 m_errorMonitor->VerifyFound();
4918
4919 // Clean-up
4920 vkDestroyBuffer(m_device->device(), buffer, NULL);
4921 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4922 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4923 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4924 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4925}
4926
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004927TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004928 TEST_DESCRIPTION(
4929 "Attempt to draw with a command buffer that is invalid "
4930 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004931 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932
4933 VkImage image;
4934 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4935 VkImageCreateInfo image_create_info = {};
4936 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4937 image_create_info.pNext = NULL;
4938 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4939 image_create_info.format = tex_format;
4940 image_create_info.extent.width = 32;
4941 image_create_info.extent.height = 32;
4942 image_create_info.extent.depth = 1;
4943 image_create_info.mipLevels = 1;
4944 image_create_info.arrayLayers = 1;
4945 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4946 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004947 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004949 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004950 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004951 // Have to bind memory to image before recording cmd in cmd buffer using it
4952 VkMemoryRequirements mem_reqs;
4953 VkDeviceMemory image_mem;
4954 bool pass;
4955 VkMemoryAllocateInfo mem_alloc = {};
4956 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4957 mem_alloc.pNext = NULL;
4958 mem_alloc.memoryTypeIndex = 0;
4959 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4960 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004961 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004962 ASSERT_TRUE(pass);
4963 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4964 ASSERT_VK_SUCCESS(err);
4965 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4966 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004967
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004968 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004969 VkClearColorValue ccv;
4970 ccv.float32[0] = 1.0f;
4971 ccv.float32[1] = 1.0f;
4972 ccv.float32[2] = 1.0f;
4973 ccv.float32[3] = 1.0f;
4974 VkImageSubresourceRange isr = {};
4975 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004976 isr.baseArrayLayer = 0;
4977 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004978 isr.layerCount = 1;
4979 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004980 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004981 m_commandBuffer->EndCommandBuffer();
4982
Mark Lobodzinski33826372017-04-13 11:10:11 -06004983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004984 // Destroy image dependency prior to submit to cause ERROR
4985 vkDestroyImage(m_device->device(), image, NULL);
4986
4987 VkSubmitInfo submit_info = {};
4988 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4989 submit_info.commandBufferCount = 1;
4990 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4991 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4992
4993 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004994 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004995}
4996
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004997TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004998 TEST_DESCRIPTION(
4999 "Attempt to draw with a command buffer that is invalid "
5000 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005001 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005002 VkFormatProperties format_properties;
5003 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005004 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5005 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 return;
5007 }
5008
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005009 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5010
5011 VkImageCreateInfo image_ci = {};
5012 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5013 image_ci.pNext = NULL;
5014 image_ci.imageType = VK_IMAGE_TYPE_2D;
5015 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5016 image_ci.extent.width = 32;
5017 image_ci.extent.height = 32;
5018 image_ci.extent.depth = 1;
5019 image_ci.mipLevels = 1;
5020 image_ci.arrayLayers = 1;
5021 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5022 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005023 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005024 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5025 image_ci.flags = 0;
5026 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005027 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005028
5029 VkMemoryRequirements memory_reqs;
5030 VkDeviceMemory image_memory;
5031 bool pass;
5032 VkMemoryAllocateInfo memory_info = {};
5033 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5034 memory_info.pNext = NULL;
5035 memory_info.allocationSize = 0;
5036 memory_info.memoryTypeIndex = 0;
5037 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5038 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005039 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005040 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005041 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 ASSERT_VK_SUCCESS(err);
5043 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5044 ASSERT_VK_SUCCESS(err);
5045
5046 VkImageViewCreateInfo ivci = {
5047 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5048 nullptr,
5049 0,
5050 image,
5051 VK_IMAGE_VIEW_TYPE_2D,
5052 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005053 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005054 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5055 };
5056 VkImageView view;
5057 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5058 ASSERT_VK_SUCCESS(err);
5059
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005060 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005061 VkFramebuffer fb;
5062 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5063 ASSERT_VK_SUCCESS(err);
5064
5065 // Just use default renderpass with our framebuffer
5066 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005067 m_renderPassBeginInfo.renderArea.extent.width = 32;
5068 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005069 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005070 m_commandBuffer->BeginCommandBuffer();
5071 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5072 m_commandBuffer->EndRenderPass();
5073 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005074 // Destroy image attached to framebuffer to invalidate cmd buffer
5075 vkDestroyImage(m_device->device(), image, NULL);
5076 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005078 QueueCommandBuffer(false);
5079 m_errorMonitor->VerifyFound();
5080
5081 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5082 vkDestroyImageView(m_device->device(), view, nullptr);
5083 vkFreeMemory(m_device->device(), image_memory, nullptr);
5084}
5085
Tobin Ehlisb329f992016-10-12 13:20:29 -06005086TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5087 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005088 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005089 VkFormatProperties format_properties;
5090 VkResult err = VK_SUCCESS;
5091 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5092
Tobin Ehlisb329f992016-10-12 13:20:29 -06005093 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5094
5095 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005096 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 -06005097 ASSERT_TRUE(image.initialized());
5098 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5099
5100 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5101 VkFramebuffer fb;
5102 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5103 ASSERT_VK_SUCCESS(err);
5104
5105 // Just use default renderpass with our framebuffer
5106 m_renderPassBeginInfo.framebuffer = fb;
5107 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005108 m_commandBuffer->BeginCommandBuffer();
5109 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5110 m_commandBuffer->EndRenderPass();
5111 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005112 // Submit cmd buffer to put it in-flight
5113 VkSubmitInfo submit_info = {};
5114 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5115 submit_info.commandBufferCount = 1;
5116 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5117 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5118 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005120 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5121 m_errorMonitor->VerifyFound();
5122 // Wait for queue to complete so we can safely destroy everything
5123 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005124 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5125 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005126 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5127}
5128
Tobin Ehlis88becd72016-09-21 14:33:41 -06005129TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5130 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005131 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005132 VkFormatProperties format_properties;
5133 VkResult err = VK_SUCCESS;
5134 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005135
Tobin Ehlis88becd72016-09-21 14:33:41 -06005136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5137
5138 VkImageCreateInfo image_ci = {};
5139 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5140 image_ci.pNext = NULL;
5141 image_ci.imageType = VK_IMAGE_TYPE_2D;
5142 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5143 image_ci.extent.width = 256;
5144 image_ci.extent.height = 256;
5145 image_ci.extent.depth = 1;
5146 image_ci.mipLevels = 1;
5147 image_ci.arrayLayers = 1;
5148 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5149 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005150 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005151 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5152 image_ci.flags = 0;
5153 VkImage image;
5154 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5155
5156 VkMemoryRequirements memory_reqs;
5157 VkDeviceMemory image_memory;
5158 bool pass;
5159 VkMemoryAllocateInfo memory_info = {};
5160 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5161 memory_info.pNext = NULL;
5162 memory_info.allocationSize = 0;
5163 memory_info.memoryTypeIndex = 0;
5164 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5165 memory_info.allocationSize = memory_reqs.size;
5166 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5167 ASSERT_TRUE(pass);
5168 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5169 ASSERT_VK_SUCCESS(err);
5170 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5171 ASSERT_VK_SUCCESS(err);
5172
5173 VkImageViewCreateInfo ivci = {
5174 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5175 nullptr,
5176 0,
5177 image,
5178 VK_IMAGE_VIEW_TYPE_2D,
5179 VK_FORMAT_B8G8R8A8_UNORM,
5180 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5181 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5182 };
5183 VkImageView view;
5184 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5185 ASSERT_VK_SUCCESS(err);
5186
5187 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5188 VkFramebuffer fb;
5189 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5190 ASSERT_VK_SUCCESS(err);
5191
5192 // Just use default renderpass with our framebuffer
5193 m_renderPassBeginInfo.framebuffer = fb;
5194 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005195 m_commandBuffer->BeginCommandBuffer();
5196 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5197 m_commandBuffer->EndRenderPass();
5198 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005199 // Submit cmd buffer to put it (and attached imageView) in-flight
5200 VkSubmitInfo submit_info = {};
5201 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5202 submit_info.commandBufferCount = 1;
5203 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5204 // Submit cmd buffer to put framebuffer and children in-flight
5205 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5206 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005208 vkDestroyImage(m_device->device(), image, NULL);
5209 m_errorMonitor->VerifyFound();
5210 // Wait for queue to complete so we can safely destroy image and other objects
5211 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005212 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5213 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005214 vkDestroyImage(m_device->device(), image, NULL);
5215 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5216 vkDestroyImageView(m_device->device(), view, nullptr);
5217 vkFreeMemory(m_device->device(), image_memory, nullptr);
5218}
5219
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005220TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5221 TEST_DESCRIPTION("Delete in-use renderPass.");
5222
Tony Barbour1fa09702017-03-16 12:09:08 -06005223 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5225
5226 // Create simple renderpass
5227 VkAttachmentReference attach = {};
5228 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5229 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005230 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005231 subpass.pColorAttachments = &attach;
5232 VkRenderPassCreateInfo rpci = {};
5233 rpci.subpassCount = 1;
5234 rpci.pSubpasses = &subpass;
5235 rpci.attachmentCount = 1;
5236 VkAttachmentDescription attach_desc = {};
5237 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5238 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5239 rpci.pAttachments = &attach_desc;
5240 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5241 VkRenderPass rp;
5242 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5243 ASSERT_VK_SUCCESS(err);
5244
5245 // Create a pipeline that uses the given renderpass
5246 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5247 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5248
5249 VkPipelineLayout pipeline_layout;
5250 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5251 ASSERT_VK_SUCCESS(err);
5252
5253 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5254 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5255 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005256 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005257 vp_state_ci.pViewports = &vp;
5258 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005259 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005260 vp_state_ci.pScissors = &scissors;
5261
5262 VkPipelineShaderStageCreateInfo shaderStages[2];
5263 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5264
5265 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005266 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 -06005267 // but add it to be able to run on more devices
5268 shaderStages[0] = vs.GetStageCreateInfo();
5269 shaderStages[1] = fs.GetStageCreateInfo();
5270
5271 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5272 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5273
5274 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5275 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5276 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5277
5278 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5279 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5280 rs_ci.rasterizerDiscardEnable = true;
5281 rs_ci.lineWidth = 1.0f;
5282
5283 VkPipelineColorBlendAttachmentState att = {};
5284 att.blendEnable = VK_FALSE;
5285 att.colorWriteMask = 0xf;
5286
5287 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5288 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5289 cb_ci.attachmentCount = 1;
5290 cb_ci.pAttachments = &att;
5291
5292 VkGraphicsPipelineCreateInfo gp_ci = {};
5293 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5294 gp_ci.stageCount = 2;
5295 gp_ci.pStages = shaderStages;
5296 gp_ci.pVertexInputState = &vi_ci;
5297 gp_ci.pInputAssemblyState = &ia_ci;
5298 gp_ci.pViewportState = &vp_state_ci;
5299 gp_ci.pRasterizationState = &rs_ci;
5300 gp_ci.pColorBlendState = &cb_ci;
5301 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5302 gp_ci.layout = pipeline_layout;
5303 gp_ci.renderPass = rp;
5304
5305 VkPipelineCacheCreateInfo pc_ci = {};
5306 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5307
Dave Houlton756e6742017-03-23 14:33:22 -06005308 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005309 VkPipeline pipeline;
5310 VkPipelineCache pipe_cache;
5311 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5312 ASSERT_VK_SUCCESS(err);
5313
5314 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5315 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005316
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005317 // Bind pipeline to cmd buffer, will also bind renderpass
5318 m_commandBuffer->BeginCommandBuffer();
5319 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5320 m_commandBuffer->EndCommandBuffer();
5321
5322 VkSubmitInfo submit_info = {};
5323 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5324 submit_info.commandBufferCount = 1;
5325 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5326 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005327 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005328
5329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5330 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5331 m_errorMonitor->VerifyFound();
5332
5333 // Wait for queue to complete so we can safely destroy everything
5334 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005335 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005336 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005337 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5338 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5339 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5340 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5341}
5342
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005343TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005344 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005345 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005346
5347 VkImage image;
5348 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5349 VkImageCreateInfo image_create_info = {};
5350 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5351 image_create_info.pNext = NULL;
5352 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5353 image_create_info.format = tex_format;
5354 image_create_info.extent.width = 32;
5355 image_create_info.extent.height = 32;
5356 image_create_info.extent.depth = 1;
5357 image_create_info.mipLevels = 1;
5358 image_create_info.arrayLayers = 1;
5359 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5360 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005361 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005362 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005363 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005364 ASSERT_VK_SUCCESS(err);
5365 // Have to bind memory to image before recording cmd in cmd buffer using it
5366 VkMemoryRequirements mem_reqs;
5367 VkDeviceMemory image_mem;
5368 bool pass;
5369 VkMemoryAllocateInfo mem_alloc = {};
5370 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5371 mem_alloc.pNext = NULL;
5372 mem_alloc.memoryTypeIndex = 0;
5373 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5374 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005375 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005376 ASSERT_TRUE(pass);
5377 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5378 ASSERT_VK_SUCCESS(err);
5379
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005380 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005382 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005383
5384 m_commandBuffer->BeginCommandBuffer();
5385 VkClearColorValue ccv;
5386 ccv.float32[0] = 1.0f;
5387 ccv.float32[1] = 1.0f;
5388 ccv.float32[2] = 1.0f;
5389 ccv.float32[3] = 1.0f;
5390 VkImageSubresourceRange isr = {};
5391 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5392 isr.baseArrayLayer = 0;
5393 isr.baseMipLevel = 0;
5394 isr.layerCount = 1;
5395 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005396 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005397 m_commandBuffer->EndCommandBuffer();
5398
5399 m_errorMonitor->VerifyFound();
5400 vkDestroyImage(m_device->device(), image, NULL);
5401 vkFreeMemory(m_device->device(), image_mem, nullptr);
5402}
5403
5404TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005405 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005406 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005407
5408 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005409 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 -06005410 VK_IMAGE_TILING_OPTIMAL, 0);
5411 ASSERT_TRUE(image.initialized());
5412
5413 VkBuffer buffer;
5414 VkDeviceMemory mem;
5415 VkMemoryRequirements mem_reqs;
5416
5417 VkBufferCreateInfo buf_info = {};
5418 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005419 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005420 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005421 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5422 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5423 ASSERT_VK_SUCCESS(err);
5424
5425 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5426
5427 VkMemoryAllocateInfo alloc_info = {};
5428 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005429 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005430 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005431 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 -06005432 if (!pass) {
5433 vkDestroyBuffer(m_device->device(), buffer, NULL);
5434 return;
5435 }
5436 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5437 ASSERT_VK_SUCCESS(err);
5438
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005439 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005441 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005442 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005443 region.bufferRowLength = 16;
5444 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005445 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5446
5447 region.imageSubresource.layerCount = 1;
5448 region.imageExtent.height = 4;
5449 region.imageExtent.width = 4;
5450 region.imageExtent.depth = 1;
5451 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005452 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5453 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005454 m_commandBuffer->EndCommandBuffer();
5455
5456 m_errorMonitor->VerifyFound();
5457
5458 vkDestroyBuffer(m_device->device(), buffer, NULL);
5459 vkFreeMemory(m_device->handle(), mem, NULL);
5460}
5461
Tobin Ehlis85940f52016-07-07 16:57:21 -06005462TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005463 TEST_DESCRIPTION(
5464 "Attempt to draw with a command buffer that is invalid "
5465 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005466 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005467
5468 VkEvent event;
5469 VkEventCreateInfo evci = {};
5470 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5471 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5472 ASSERT_VK_SUCCESS(result);
5473
5474 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005475 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005476 m_commandBuffer->EndCommandBuffer();
5477
Mark Lobodzinski33826372017-04-13 11:10:11 -06005478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005479 // Destroy event dependency prior to submit to cause ERROR
5480 vkDestroyEvent(m_device->device(), event, NULL);
5481
5482 VkSubmitInfo submit_info = {};
5483 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5484 submit_info.commandBufferCount = 1;
5485 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5486 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5487
5488 m_errorMonitor->VerifyFound();
5489}
5490
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005491TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005492 TEST_DESCRIPTION(
5493 "Attempt to draw with a command buffer that is invalid "
5494 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005495 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005496
5497 VkQueryPool query_pool;
5498 VkQueryPoolCreateInfo qpci{};
5499 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5500 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5501 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005502 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005503 ASSERT_VK_SUCCESS(result);
5504
5505 m_commandBuffer->BeginCommandBuffer();
5506 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5507 m_commandBuffer->EndCommandBuffer();
5508
Mark Lobodzinski33826372017-04-13 11:10:11 -06005509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005510 // Destroy query pool dependency prior to submit to cause ERROR
5511 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5512
5513 VkSubmitInfo submit_info = {};
5514 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5515 submit_info.commandBufferCount = 1;
5516 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5517 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5518
5519 m_errorMonitor->VerifyFound();
5520}
5521
Tobin Ehlis24130d92016-07-08 15:50:53 -06005522TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005523 TEST_DESCRIPTION(
5524 "Attempt to draw with a command buffer that is invalid "
5525 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005526 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005527 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5528
5529 VkResult err;
5530
5531 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5532 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5533
5534 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005535 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005536 ASSERT_VK_SUCCESS(err);
5537
5538 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5539 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5540 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005541 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005542 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005543 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005544 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005545 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005546
5547 VkPipelineShaderStageCreateInfo shaderStages[2];
5548 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5549
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005550 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005551 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 -06005552 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005553 shaderStages[0] = vs.GetStageCreateInfo();
5554 shaderStages[1] = fs.GetStageCreateInfo();
5555
5556 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5557 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5558
5559 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5560 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5561 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5562
5563 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5564 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005565 rs_ci.rasterizerDiscardEnable = true;
5566 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567
5568 VkPipelineColorBlendAttachmentState att = {};
5569 att.blendEnable = VK_FALSE;
5570 att.colorWriteMask = 0xf;
5571
5572 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5573 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5574 cb_ci.attachmentCount = 1;
5575 cb_ci.pAttachments = &att;
5576
5577 VkGraphicsPipelineCreateInfo gp_ci = {};
5578 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5579 gp_ci.stageCount = 2;
5580 gp_ci.pStages = shaderStages;
5581 gp_ci.pVertexInputState = &vi_ci;
5582 gp_ci.pInputAssemblyState = &ia_ci;
5583 gp_ci.pViewportState = &vp_state_ci;
5584 gp_ci.pRasterizationState = &rs_ci;
5585 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005586 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5587 gp_ci.layout = pipeline_layout;
5588 gp_ci.renderPass = renderPass();
5589
5590 VkPipelineCacheCreateInfo pc_ci = {};
5591 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5592
5593 VkPipeline pipeline;
5594 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005595 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005596 ASSERT_VK_SUCCESS(err);
5597
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005598 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005599 ASSERT_VK_SUCCESS(err);
5600
5601 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005602 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005603 m_commandBuffer->EndCommandBuffer();
5604 // Now destroy pipeline in order to cause error when submitting
5605 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5606
Mark Lobodzinski33826372017-04-13 11:10:11 -06005607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005608
5609 VkSubmitInfo submit_info = {};
5610 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5611 submit_info.commandBufferCount = 1;
5612 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5613 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5614
5615 m_errorMonitor->VerifyFound();
5616 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5617 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5618}
5619
Tobin Ehlis31289162016-08-17 14:57:58 -06005620TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005621 TEST_DESCRIPTION(
5622 "Attempt to draw with a command buffer that is invalid "
5623 "due to a bound descriptor set with a buffer dependency "
5624 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005625 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005626 ASSERT_NO_FATAL_FAILURE(InitViewport());
5627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5628
5629 VkDescriptorPoolSize ds_type_count = {};
5630 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5631 ds_type_count.descriptorCount = 1;
5632
5633 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5634 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5635 ds_pool_ci.pNext = NULL;
5636 ds_pool_ci.maxSets = 1;
5637 ds_pool_ci.poolSizeCount = 1;
5638 ds_pool_ci.pPoolSizes = &ds_type_count;
5639
5640 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005641 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005642 ASSERT_VK_SUCCESS(err);
5643
5644 VkDescriptorSetLayoutBinding dsl_binding = {};
5645 dsl_binding.binding = 0;
5646 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5647 dsl_binding.descriptorCount = 1;
5648 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5649 dsl_binding.pImmutableSamplers = NULL;
5650
5651 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5652 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5653 ds_layout_ci.pNext = NULL;
5654 ds_layout_ci.bindingCount = 1;
5655 ds_layout_ci.pBindings = &dsl_binding;
5656 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005657 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005658 ASSERT_VK_SUCCESS(err);
5659
5660 VkDescriptorSet descriptorSet;
5661 VkDescriptorSetAllocateInfo alloc_info = {};
5662 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5663 alloc_info.descriptorSetCount = 1;
5664 alloc_info.descriptorPool = ds_pool;
5665 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005666 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005667 ASSERT_VK_SUCCESS(err);
5668
5669 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5670 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5671 pipeline_layout_ci.pNext = NULL;
5672 pipeline_layout_ci.setLayoutCount = 1;
5673 pipeline_layout_ci.pSetLayouts = &ds_layout;
5674
5675 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005676 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005677 ASSERT_VK_SUCCESS(err);
5678
5679 // Create a buffer to update the descriptor with
5680 uint32_t qfi = 0;
5681 VkBufferCreateInfo buffCI = {};
5682 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5683 buffCI.size = 1024;
5684 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5685 buffCI.queueFamilyIndexCount = 1;
5686 buffCI.pQueueFamilyIndices = &qfi;
5687
5688 VkBuffer buffer;
5689 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5690 ASSERT_VK_SUCCESS(err);
5691 // Allocate memory and bind to buffer so we can make it to the appropriate
5692 // error
5693 VkMemoryAllocateInfo mem_alloc = {};
5694 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5695 mem_alloc.pNext = NULL;
5696 mem_alloc.allocationSize = 1024;
5697 mem_alloc.memoryTypeIndex = 0;
5698
5699 VkMemoryRequirements memReqs;
5700 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005701 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005702 if (!pass) {
5703 vkDestroyBuffer(m_device->device(), buffer, NULL);
5704 return;
5705 }
5706
5707 VkDeviceMemory mem;
5708 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5709 ASSERT_VK_SUCCESS(err);
5710 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5711 ASSERT_VK_SUCCESS(err);
5712 // Correctly update descriptor to avoid "NOT_UPDATED" error
5713 VkDescriptorBufferInfo buffInfo = {};
5714 buffInfo.buffer = buffer;
5715 buffInfo.offset = 0;
5716 buffInfo.range = 1024;
5717
5718 VkWriteDescriptorSet descriptor_write;
5719 memset(&descriptor_write, 0, sizeof(descriptor_write));
5720 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5721 descriptor_write.dstSet = descriptorSet;
5722 descriptor_write.dstBinding = 0;
5723 descriptor_write.descriptorCount = 1;
5724 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5725 descriptor_write.pBufferInfo = &buffInfo;
5726
5727 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5728
5729 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005730 char const *vsSource =
5731 "#version 450\n"
5732 "\n"
5733 "out gl_PerVertex { \n"
5734 " vec4 gl_Position;\n"
5735 "};\n"
5736 "void main(){\n"
5737 " gl_Position = vec4(1);\n"
5738 "}\n";
5739 char const *fsSource =
5740 "#version 450\n"
5741 "\n"
5742 "layout(location=0) out vec4 x;\n"
5743 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5744 "void main(){\n"
5745 " x = vec4(bar.y);\n"
5746 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005747 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5748 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5749 VkPipelineObj pipe(m_device);
5750 pipe.AddShader(&vs);
5751 pipe.AddShader(&fs);
5752 pipe.AddColorAttachment();
5753 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5754
Tony Barbour552f6c02016-12-21 14:34:07 -07005755 m_commandBuffer->BeginCommandBuffer();
5756 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005757 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5758 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5759 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005760
5761 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5762 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5763
Tobin Ehlis31289162016-08-17 14:57:58 -06005764 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005765 m_commandBuffer->EndRenderPass();
5766 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005768 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5769 vkDestroyBuffer(m_device->device(), buffer, NULL);
5770 // Attempt to submit cmd buffer
5771 VkSubmitInfo submit_info = {};
5772 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5773 submit_info.commandBufferCount = 1;
5774 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5775 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5776 m_errorMonitor->VerifyFound();
5777 // Cleanup
5778 vkFreeMemory(m_device->device(), mem, NULL);
5779
5780 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5781 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5782 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5783}
5784
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005785TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005786 TEST_DESCRIPTION(
5787 "Attempt to draw with a command buffer that is invalid "
5788 "due to a bound descriptor sets with a combined image "
5789 "sampler having their image, sampler, and descriptor set "
5790 "each respectively destroyed and then attempting to "
5791 "submit associated cmd buffers. Attempt to destroy a "
5792 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005793 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005794 ASSERT_NO_FATAL_FAILURE(InitViewport());
5795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5796
5797 VkDescriptorPoolSize ds_type_count = {};
5798 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5799 ds_type_count.descriptorCount = 1;
5800
5801 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5802 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5803 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005804 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005805 ds_pool_ci.maxSets = 1;
5806 ds_pool_ci.poolSizeCount = 1;
5807 ds_pool_ci.pPoolSizes = &ds_type_count;
5808
5809 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005810 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005811 ASSERT_VK_SUCCESS(err);
5812
5813 VkDescriptorSetLayoutBinding dsl_binding = {};
5814 dsl_binding.binding = 0;
5815 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5816 dsl_binding.descriptorCount = 1;
5817 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5818 dsl_binding.pImmutableSamplers = NULL;
5819
5820 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5821 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5822 ds_layout_ci.pNext = NULL;
5823 ds_layout_ci.bindingCount = 1;
5824 ds_layout_ci.pBindings = &dsl_binding;
5825 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005826 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005827 ASSERT_VK_SUCCESS(err);
5828
5829 VkDescriptorSet descriptorSet;
5830 VkDescriptorSetAllocateInfo alloc_info = {};
5831 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5832 alloc_info.descriptorSetCount = 1;
5833 alloc_info.descriptorPool = ds_pool;
5834 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005835 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005836 ASSERT_VK_SUCCESS(err);
5837
5838 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5839 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5840 pipeline_layout_ci.pNext = NULL;
5841 pipeline_layout_ci.setLayoutCount = 1;
5842 pipeline_layout_ci.pSetLayouts = &ds_layout;
5843
5844 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005845 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005846 ASSERT_VK_SUCCESS(err);
5847
5848 // Create images to update the descriptor with
5849 VkImage image;
5850 VkImage image2;
5851 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5852 const int32_t tex_width = 32;
5853 const int32_t tex_height = 32;
5854 VkImageCreateInfo image_create_info = {};
5855 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5856 image_create_info.pNext = NULL;
5857 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5858 image_create_info.format = tex_format;
5859 image_create_info.extent.width = tex_width;
5860 image_create_info.extent.height = tex_height;
5861 image_create_info.extent.depth = 1;
5862 image_create_info.mipLevels = 1;
5863 image_create_info.arrayLayers = 1;
5864 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5865 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5866 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5867 image_create_info.flags = 0;
5868 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5869 ASSERT_VK_SUCCESS(err);
5870 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5871 ASSERT_VK_SUCCESS(err);
5872
5873 VkMemoryRequirements memory_reqs;
5874 VkDeviceMemory image_memory;
5875 bool pass;
5876 VkMemoryAllocateInfo memory_info = {};
5877 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5878 memory_info.pNext = NULL;
5879 memory_info.allocationSize = 0;
5880 memory_info.memoryTypeIndex = 0;
5881 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5882 // Allocate enough memory for both images
5883 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005884 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005885 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005886 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005887 ASSERT_VK_SUCCESS(err);
5888 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5889 ASSERT_VK_SUCCESS(err);
5890 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005891 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005892 ASSERT_VK_SUCCESS(err);
5893
5894 VkImageViewCreateInfo image_view_create_info = {};
5895 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5896 image_view_create_info.image = image;
5897 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5898 image_view_create_info.format = tex_format;
5899 image_view_create_info.subresourceRange.layerCount = 1;
5900 image_view_create_info.subresourceRange.baseMipLevel = 0;
5901 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005902 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005903
5904 VkImageView view;
5905 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005906 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005907 ASSERT_VK_SUCCESS(err);
5908 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005909 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005910 ASSERT_VK_SUCCESS(err);
5911 // Create Samplers
5912 VkSamplerCreateInfo sampler_ci = {};
5913 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5914 sampler_ci.pNext = NULL;
5915 sampler_ci.magFilter = VK_FILTER_NEAREST;
5916 sampler_ci.minFilter = VK_FILTER_NEAREST;
5917 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5918 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5919 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5920 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5921 sampler_ci.mipLodBias = 1.0;
5922 sampler_ci.anisotropyEnable = VK_FALSE;
5923 sampler_ci.maxAnisotropy = 1;
5924 sampler_ci.compareEnable = VK_FALSE;
5925 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5926 sampler_ci.minLod = 1.0;
5927 sampler_ci.maxLod = 1.0;
5928 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5929 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5930 VkSampler sampler;
5931 VkSampler sampler2;
5932 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5933 ASSERT_VK_SUCCESS(err);
5934 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5935 ASSERT_VK_SUCCESS(err);
5936 // Update descriptor with image and sampler
5937 VkDescriptorImageInfo img_info = {};
5938 img_info.sampler = sampler;
5939 img_info.imageView = view;
5940 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5941
5942 VkWriteDescriptorSet descriptor_write;
5943 memset(&descriptor_write, 0, sizeof(descriptor_write));
5944 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5945 descriptor_write.dstSet = descriptorSet;
5946 descriptor_write.dstBinding = 0;
5947 descriptor_write.descriptorCount = 1;
5948 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5949 descriptor_write.pImageInfo = &img_info;
5950
5951 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5952
5953 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005954 char const *vsSource =
5955 "#version 450\n"
5956 "\n"
5957 "out gl_PerVertex { \n"
5958 " vec4 gl_Position;\n"
5959 "};\n"
5960 "void main(){\n"
5961 " gl_Position = vec4(1);\n"
5962 "}\n";
5963 char const *fsSource =
5964 "#version 450\n"
5965 "\n"
5966 "layout(set=0, binding=0) uniform sampler2D s;\n"
5967 "layout(location=0) out vec4 x;\n"
5968 "void main(){\n"
5969 " x = texture(s, vec2(1));\n"
5970 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005971 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5972 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5973 VkPipelineObj pipe(m_device);
5974 pipe.AddShader(&vs);
5975 pipe.AddShader(&fs);
5976 pipe.AddColorAttachment();
5977 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5978
5979 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005981 m_commandBuffer->BeginCommandBuffer();
5982 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005983 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5984 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5985 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005986 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5987 VkRect2D scissor = {{0, 0}, {16, 16}};
5988 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5989 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005990 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005991 m_commandBuffer->EndRenderPass();
5992 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005993 // Destroy sampler invalidates the cmd buffer, causing error on submit
5994 vkDestroySampler(m_device->device(), sampler, NULL);
5995 // Attempt to submit cmd buffer
5996 VkSubmitInfo submit_info = {};
5997 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5998 submit_info.commandBufferCount = 1;
5999 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6000 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6001 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07006002
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006003 // Now re-update descriptor with valid sampler and delete image
6004 img_info.sampler = sampler2;
6005 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006006
6007 VkCommandBufferBeginInfo info = {};
6008 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6009 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
6010
Mark Lobodzinski33826372017-04-13 11:10:11 -06006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07006012 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006013 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006014 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6015 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6016 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006017 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6018 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006019 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006020 m_commandBuffer->EndRenderPass();
6021 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006022 // Destroy image invalidates the cmd buffer, causing error on submit
6023 vkDestroyImage(m_device->device(), image, NULL);
6024 // Attempt to submit cmd buffer
6025 submit_info = {};
6026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6027 submit_info.commandBufferCount = 1;
6028 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6030 m_errorMonitor->VerifyFound();
6031 // Now update descriptor to be valid, but then free descriptor
6032 img_info.imageView = view2;
6033 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006034 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006036 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6037 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6038 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006039 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6040 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006041 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006042 m_commandBuffer->EndRenderPass();
6043 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006044 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006045
6046 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006048 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006049 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006050
6051 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006052 // 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 -07006053 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006054 m_errorMonitor->SetUnexpectedError(
6055 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6056 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006057 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006058 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6059
6060 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006061 submit_info = {};
6062 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6063 submit_info.commandBufferCount = 1;
6064 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006066 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6067 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006068
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006069 // Cleanup
6070 vkFreeMemory(m_device->device(), image_memory, NULL);
6071 vkDestroySampler(m_device->device(), sampler2, NULL);
6072 vkDestroyImage(m_device->device(), image2, NULL);
6073 vkDestroyImageView(m_device->device(), view, NULL);
6074 vkDestroyImageView(m_device->device(), view2, NULL);
6075 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6076 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6077 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6078}
6079
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006080TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6081 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6082 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6083 ASSERT_NO_FATAL_FAILURE(InitViewport());
6084 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6085
6086 VkDescriptorPoolSize ds_type_count = {};
6087 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6088 ds_type_count.descriptorCount = 1;
6089
6090 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6091 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6092 ds_pool_ci.pNext = NULL;
6093 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6094 ds_pool_ci.maxSets = 1;
6095 ds_pool_ci.poolSizeCount = 1;
6096 ds_pool_ci.pPoolSizes = &ds_type_count;
6097
6098 VkDescriptorPool ds_pool;
6099 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6100 ASSERT_VK_SUCCESS(err);
6101
6102 VkDescriptorSetLayoutBinding dsl_binding = {};
6103 dsl_binding.binding = 0;
6104 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6105 dsl_binding.descriptorCount = 1;
6106 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6107 dsl_binding.pImmutableSamplers = NULL;
6108
6109 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6110 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6111 ds_layout_ci.pNext = NULL;
6112 ds_layout_ci.bindingCount = 1;
6113 ds_layout_ci.pBindings = &dsl_binding;
6114 VkDescriptorSetLayout ds_layout;
6115 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6116 ASSERT_VK_SUCCESS(err);
6117
6118 VkDescriptorSet descriptorSet;
6119 VkDescriptorSetAllocateInfo alloc_info = {};
6120 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6121 alloc_info.descriptorSetCount = 1;
6122 alloc_info.descriptorPool = ds_pool;
6123 alloc_info.pSetLayouts = &ds_layout;
6124 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6125 ASSERT_VK_SUCCESS(err);
6126
6127 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6128 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6129 pipeline_layout_ci.pNext = NULL;
6130 pipeline_layout_ci.setLayoutCount = 1;
6131 pipeline_layout_ci.pSetLayouts = &ds_layout;
6132
6133 VkPipelineLayout pipeline_layout;
6134 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6135 ASSERT_VK_SUCCESS(err);
6136
6137 // Create images to update the descriptor with
6138 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6139 VkImageObj image(m_device);
6140 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6141 0);
6142 ASSERT_TRUE(image.initialized());
6143
6144 VkImageViewCreateInfo image_view_create_info = {};
6145 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6146 image_view_create_info.image = image.handle();
6147 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6148 image_view_create_info.format = format;
6149 image_view_create_info.subresourceRange.layerCount = 1;
6150 image_view_create_info.subresourceRange.baseMipLevel = 0;
6151 image_view_create_info.subresourceRange.levelCount = 1;
6152 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6153
6154 VkImageView view;
6155 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6156 ASSERT_VK_SUCCESS(err);
6157 // Create Sampler
6158 VkSamplerCreateInfo sampler_ci = {};
6159 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6160 sampler_ci.pNext = NULL;
6161 sampler_ci.magFilter = VK_FILTER_NEAREST;
6162 sampler_ci.minFilter = VK_FILTER_NEAREST;
6163 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6164 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6165 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6166 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6167 sampler_ci.mipLodBias = 1.0;
6168 sampler_ci.anisotropyEnable = VK_FALSE;
6169 sampler_ci.maxAnisotropy = 1;
6170 sampler_ci.compareEnable = VK_FALSE;
6171 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6172 sampler_ci.minLod = 1.0;
6173 sampler_ci.maxLod = 1.0;
6174 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6175 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6176 VkSampler sampler;
6177 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6178 ASSERT_VK_SUCCESS(err);
6179 // Update descriptor with image and sampler
6180 VkDescriptorImageInfo img_info = {};
6181 img_info.sampler = sampler;
6182 img_info.imageView = view;
6183 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6184 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6185
6186 VkWriteDescriptorSet descriptor_write;
6187 memset(&descriptor_write, 0, sizeof(descriptor_write));
6188 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6189 descriptor_write.dstSet = descriptorSet;
6190 descriptor_write.dstBinding = 0;
6191 descriptor_write.descriptorCount = 1;
6192 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6193 descriptor_write.pImageInfo = &img_info;
6194
6195 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6196
6197 // Create PSO to be used for draw-time errors below
6198 char const *vsSource =
6199 "#version 450\n"
6200 "\n"
6201 "out gl_PerVertex { \n"
6202 " vec4 gl_Position;\n"
6203 "};\n"
6204 "void main(){\n"
6205 " gl_Position = vec4(1);\n"
6206 "}\n";
6207 char const *fsSource =
6208 "#version 450\n"
6209 "\n"
6210 "layout(set=0, binding=0) uniform sampler2D s;\n"
6211 "layout(location=0) out vec4 x;\n"
6212 "void main(){\n"
6213 " x = texture(s, vec2(1));\n"
6214 "}\n";
6215 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6216 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6217 VkPipelineObj pipe(m_device);
6218 pipe.AddShader(&vs);
6219 pipe.AddShader(&fs);
6220 pipe.AddColorAttachment();
6221 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6222
6223 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6224 cmd_buf.BeginCommandBuffer();
6225 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
6226 // record layout different than actual descriptor layout of SHADER_RO
6227 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
6228 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6229 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6230 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6231 VkRect2D scissor = {{0, 0}, {16, 16}};
6232 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6233 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6234 // At draw time the update layout will mis-match the actual layout
6235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6236 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6237 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6238 m_errorMonitor->SetDesiredFailureMsg(
6239 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6240 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6241 cmd_buf.Draw(1, 0, 0, 0);
6242 m_errorMonitor->VerifyFound();
6243 cmd_buf.EndRenderPass();
6244 cmd_buf.EndCommandBuffer();
6245 // Submit cmd buffer
6246 VkSubmitInfo submit_info = {};
6247 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6248 submit_info.commandBufferCount = 1;
6249 submit_info.pCommandBuffers = &cmd_buf.handle();
6250 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6251 vkQueueWaitIdle(m_device->m_queue);
6252 // Cleanup
6253 vkDestroySampler(m_device->device(), sampler, NULL);
6254 vkDestroyImageView(m_device->device(), view, NULL);
6255 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6256 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6257 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6258}
6259
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006260TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6261 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006262 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006263 ASSERT_NO_FATAL_FAILURE(InitViewport());
6264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6265
6266 VkDescriptorPoolSize ds_type_count = {};
6267 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6268 ds_type_count.descriptorCount = 1;
6269
6270 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6271 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6272 ds_pool_ci.pNext = NULL;
6273 ds_pool_ci.maxSets = 1;
6274 ds_pool_ci.poolSizeCount = 1;
6275 ds_pool_ci.pPoolSizes = &ds_type_count;
6276
6277 VkDescriptorPool ds_pool;
6278 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6279 ASSERT_VK_SUCCESS(err);
6280
6281 VkDescriptorSetLayoutBinding dsl_binding = {};
6282 dsl_binding.binding = 0;
6283 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6284 dsl_binding.descriptorCount = 1;
6285 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6286 dsl_binding.pImmutableSamplers = NULL;
6287
6288 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6289 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6290 ds_layout_ci.pNext = NULL;
6291 ds_layout_ci.bindingCount = 1;
6292 ds_layout_ci.pBindings = &dsl_binding;
6293 VkDescriptorSetLayout ds_layout;
6294 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6295 ASSERT_VK_SUCCESS(err);
6296
6297 VkDescriptorSet descriptor_set;
6298 VkDescriptorSetAllocateInfo alloc_info = {};
6299 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6300 alloc_info.descriptorSetCount = 1;
6301 alloc_info.descriptorPool = ds_pool;
6302 alloc_info.pSetLayouts = &ds_layout;
6303 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6304 ASSERT_VK_SUCCESS(err);
6305
6306 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6307 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6308 pipeline_layout_ci.pNext = NULL;
6309 pipeline_layout_ci.setLayoutCount = 1;
6310 pipeline_layout_ci.pSetLayouts = &ds_layout;
6311
6312 VkPipelineLayout pipeline_layout;
6313 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6314 ASSERT_VK_SUCCESS(err);
6315
6316 // Create image to update the descriptor with
6317 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006318 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 -06006319 ASSERT_TRUE(image.initialized());
6320
6321 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6322 // Create Sampler
6323 VkSamplerCreateInfo sampler_ci = {};
6324 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6325 sampler_ci.pNext = NULL;
6326 sampler_ci.magFilter = VK_FILTER_NEAREST;
6327 sampler_ci.minFilter = VK_FILTER_NEAREST;
6328 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6329 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6330 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6331 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6332 sampler_ci.mipLodBias = 1.0;
6333 sampler_ci.anisotropyEnable = VK_FALSE;
6334 sampler_ci.maxAnisotropy = 1;
6335 sampler_ci.compareEnable = VK_FALSE;
6336 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6337 sampler_ci.minLod = 1.0;
6338 sampler_ci.maxLod = 1.0;
6339 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6340 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6341 VkSampler sampler;
6342 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6343 ASSERT_VK_SUCCESS(err);
6344 // Update descriptor with image and sampler
6345 VkDescriptorImageInfo img_info = {};
6346 img_info.sampler = sampler;
6347 img_info.imageView = view;
6348 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6349
6350 VkWriteDescriptorSet descriptor_write;
6351 memset(&descriptor_write, 0, sizeof(descriptor_write));
6352 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6353 descriptor_write.dstSet = descriptor_set;
6354 descriptor_write.dstBinding = 0;
6355 descriptor_write.descriptorCount = 1;
6356 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6357 descriptor_write.pImageInfo = &img_info;
6358
6359 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6360
6361 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006362 char const *vsSource =
6363 "#version 450\n"
6364 "\n"
6365 "out gl_PerVertex { \n"
6366 " vec4 gl_Position;\n"
6367 "};\n"
6368 "void main(){\n"
6369 " gl_Position = vec4(1);\n"
6370 "}\n";
6371 char const *fsSource =
6372 "#version 450\n"
6373 "\n"
6374 "layout(set=0, binding=0) uniform sampler2D s;\n"
6375 "layout(location=0) out vec4 x;\n"
6376 "void main(){\n"
6377 " x = texture(s, vec2(1));\n"
6378 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006379 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6380 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6381 VkPipelineObj pipe(m_device);
6382 pipe.AddShader(&vs);
6383 pipe.AddShader(&fs);
6384 pipe.AddColorAttachment();
6385 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6386
Tony Barbour552f6c02016-12-21 14:34:07 -07006387 m_commandBuffer->BeginCommandBuffer();
6388 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006389 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6390 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6391 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006392
6393 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6394 VkRect2D scissor = {{0, 0}, {16, 16}};
6395 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6396 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6397
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006398 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006399 m_commandBuffer->EndRenderPass();
6400 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006401 // Submit cmd buffer to put pool in-flight
6402 VkSubmitInfo submit_info = {};
6403 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6404 submit_info.commandBufferCount = 1;
6405 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6406 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6407 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006409 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6410 m_errorMonitor->VerifyFound();
6411 vkQueueWaitIdle(m_device->m_queue);
6412 // Cleanup
6413 vkDestroySampler(m_device->device(), sampler, NULL);
6414 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6415 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006416 m_errorMonitor->SetUnexpectedError(
6417 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006418 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006420 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006421}
6422
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006423TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6424 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006425 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006426 ASSERT_NO_FATAL_FAILURE(InitViewport());
6427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6428
6429 VkDescriptorPoolSize ds_type_count = {};
6430 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6431 ds_type_count.descriptorCount = 1;
6432
6433 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6434 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6435 ds_pool_ci.pNext = NULL;
6436 ds_pool_ci.maxSets = 1;
6437 ds_pool_ci.poolSizeCount = 1;
6438 ds_pool_ci.pPoolSizes = &ds_type_count;
6439
6440 VkDescriptorPool ds_pool;
6441 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6442 ASSERT_VK_SUCCESS(err);
6443
6444 VkDescriptorSetLayoutBinding dsl_binding = {};
6445 dsl_binding.binding = 0;
6446 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6447 dsl_binding.descriptorCount = 1;
6448 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6449 dsl_binding.pImmutableSamplers = NULL;
6450
6451 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6452 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6453 ds_layout_ci.pNext = NULL;
6454 ds_layout_ci.bindingCount = 1;
6455 ds_layout_ci.pBindings = &dsl_binding;
6456 VkDescriptorSetLayout ds_layout;
6457 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6458 ASSERT_VK_SUCCESS(err);
6459
6460 VkDescriptorSet descriptorSet;
6461 VkDescriptorSetAllocateInfo alloc_info = {};
6462 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6463 alloc_info.descriptorSetCount = 1;
6464 alloc_info.descriptorPool = ds_pool;
6465 alloc_info.pSetLayouts = &ds_layout;
6466 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6467 ASSERT_VK_SUCCESS(err);
6468
6469 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6470 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6471 pipeline_layout_ci.pNext = NULL;
6472 pipeline_layout_ci.setLayoutCount = 1;
6473 pipeline_layout_ci.pSetLayouts = &ds_layout;
6474
6475 VkPipelineLayout pipeline_layout;
6476 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6477 ASSERT_VK_SUCCESS(err);
6478
6479 // Create images to update the descriptor with
6480 VkImage image;
6481 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6482 const int32_t tex_width = 32;
6483 const int32_t tex_height = 32;
6484 VkImageCreateInfo image_create_info = {};
6485 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6486 image_create_info.pNext = NULL;
6487 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6488 image_create_info.format = tex_format;
6489 image_create_info.extent.width = tex_width;
6490 image_create_info.extent.height = tex_height;
6491 image_create_info.extent.depth = 1;
6492 image_create_info.mipLevels = 1;
6493 image_create_info.arrayLayers = 1;
6494 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6495 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6496 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6497 image_create_info.flags = 0;
6498 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6499 ASSERT_VK_SUCCESS(err);
6500 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6501 VkMemoryRequirements memory_reqs;
6502 VkDeviceMemory image_memory;
6503 bool pass;
6504 VkMemoryAllocateInfo memory_info = {};
6505 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6506 memory_info.pNext = NULL;
6507 memory_info.allocationSize = 0;
6508 memory_info.memoryTypeIndex = 0;
6509 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6510 // Allocate enough memory for image
6511 memory_info.allocationSize = memory_reqs.size;
6512 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6513 ASSERT_TRUE(pass);
6514 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6515 ASSERT_VK_SUCCESS(err);
6516 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6517 ASSERT_VK_SUCCESS(err);
6518
6519 VkImageViewCreateInfo image_view_create_info = {};
6520 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6521 image_view_create_info.image = image;
6522 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6523 image_view_create_info.format = tex_format;
6524 image_view_create_info.subresourceRange.layerCount = 1;
6525 image_view_create_info.subresourceRange.baseMipLevel = 0;
6526 image_view_create_info.subresourceRange.levelCount = 1;
6527 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6528
6529 VkImageView view;
6530 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6531 ASSERT_VK_SUCCESS(err);
6532 // Create Samplers
6533 VkSamplerCreateInfo sampler_ci = {};
6534 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6535 sampler_ci.pNext = NULL;
6536 sampler_ci.magFilter = VK_FILTER_NEAREST;
6537 sampler_ci.minFilter = VK_FILTER_NEAREST;
6538 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6539 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6540 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6541 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6542 sampler_ci.mipLodBias = 1.0;
6543 sampler_ci.anisotropyEnable = VK_FALSE;
6544 sampler_ci.maxAnisotropy = 1;
6545 sampler_ci.compareEnable = VK_FALSE;
6546 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6547 sampler_ci.minLod = 1.0;
6548 sampler_ci.maxLod = 1.0;
6549 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6550 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6551 VkSampler sampler;
6552 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6553 ASSERT_VK_SUCCESS(err);
6554 // Update descriptor with image and sampler
6555 VkDescriptorImageInfo img_info = {};
6556 img_info.sampler = sampler;
6557 img_info.imageView = view;
6558 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6559
6560 VkWriteDescriptorSet descriptor_write;
6561 memset(&descriptor_write, 0, sizeof(descriptor_write));
6562 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6563 descriptor_write.dstSet = descriptorSet;
6564 descriptor_write.dstBinding = 0;
6565 descriptor_write.descriptorCount = 1;
6566 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6567 descriptor_write.pImageInfo = &img_info;
6568 // Break memory binding and attempt update
6569 vkFreeMemory(m_device->device(), image_memory, nullptr);
6570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006571 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6573 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6574 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6575 m_errorMonitor->VerifyFound();
6576 // Cleanup
6577 vkDestroyImage(m_device->device(), image, NULL);
6578 vkDestroySampler(m_device->device(), sampler, NULL);
6579 vkDestroyImageView(m_device->device(), view, NULL);
6580 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6581 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6582 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6583}
6584
Karl Schultz6addd812016-02-02 17:17:23 -07006585TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006586 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6587 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006588 // Create a valid cmd buffer
6589 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006590 uint64_t fake_pipeline_handle = 0xbaad6001;
6591 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006592 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6594
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006596 m_commandBuffer->BeginCommandBuffer();
6597 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006598 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006599 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006600
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006601 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006602 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 -06006603 Draw(1, 0, 0, 0);
6604 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006605
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006606 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006607 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 -07006608 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006609 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6610 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006611}
6612
Karl Schultz6addd812016-02-02 17:17:23 -07006613TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006614 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006615 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006616
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006618
Tony Barbour1fa09702017-03-16 12:09:08 -06006619 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006620 ASSERT_NO_FATAL_FAILURE(InitViewport());
6621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006622 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006623 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6624 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006625
6626 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6628 ds_pool_ci.pNext = NULL;
6629 ds_pool_ci.maxSets = 1;
6630 ds_pool_ci.poolSizeCount = 1;
6631 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006632
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006633 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006634 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006635 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006636
Tony Barboureb254902015-07-15 12:50:33 -06006637 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006638 dsl_binding.binding = 0;
6639 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6640 dsl_binding.descriptorCount = 1;
6641 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6642 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006643
Tony Barboureb254902015-07-15 12:50:33 -06006644 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006645 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6646 ds_layout_ci.pNext = NULL;
6647 ds_layout_ci.bindingCount = 1;
6648 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006649 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006650 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006651 ASSERT_VK_SUCCESS(err);
6652
6653 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006654 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006655 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006656 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006657 alloc_info.descriptorPool = ds_pool;
6658 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006659 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006660 ASSERT_VK_SUCCESS(err);
6661
Tony Barboureb254902015-07-15 12:50:33 -06006662 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006663 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6664 pipeline_layout_ci.pNext = NULL;
6665 pipeline_layout_ci.setLayoutCount = 1;
6666 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006667
6668 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006669 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006670 ASSERT_VK_SUCCESS(err);
6671
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006672 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006673 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006674 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006675 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006676
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006677 VkPipelineObj pipe(m_device);
6678 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006679 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006680 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006681 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006682
Tony Barbour552f6c02016-12-21 14:34:07 -07006683 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006684 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6685 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6686 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006687
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006688 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006689
Chia-I Wuf7458c52015-10-26 21:10:41 +08006690 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6691 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6692 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006693}
6694
Karl Schultz6addd812016-02-02 17:17:23 -07006695TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006696 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006697 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006698
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006700
Tony Barbour1fa09702017-03-16 12:09:08 -06006701 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006702 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006703 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6704 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006705
6706 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006707 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6708 ds_pool_ci.pNext = NULL;
6709 ds_pool_ci.maxSets = 1;
6710 ds_pool_ci.poolSizeCount = 1;
6711 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006712
6713 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006714 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006715 ASSERT_VK_SUCCESS(err);
6716
6717 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006718 dsl_binding.binding = 0;
6719 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6720 dsl_binding.descriptorCount = 1;
6721 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6722 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006723
6724 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006725 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6726 ds_layout_ci.pNext = NULL;
6727 ds_layout_ci.bindingCount = 1;
6728 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006729 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006731 ASSERT_VK_SUCCESS(err);
6732
6733 VkDescriptorSet descriptorSet;
6734 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006735 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006736 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006737 alloc_info.descriptorPool = ds_pool;
6738 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006739 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006740 ASSERT_VK_SUCCESS(err);
6741
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006742 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006743 VkWriteDescriptorSet descriptor_write;
6744 memset(&descriptor_write, 0, sizeof(descriptor_write));
6745 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6746 descriptor_write.dstSet = descriptorSet;
6747 descriptor_write.dstBinding = 0;
6748 descriptor_write.descriptorCount = 1;
6749 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6750 descriptor_write.pTexelBufferView = &view;
6751
6752 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6753
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006754 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006755
6756 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6757 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6758}
6759
Mark Youngd339ba32016-05-30 13:28:35 -06006760TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006761 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 -06006762
6763 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006765 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006766
Tony Barbour1fa09702017-03-16 12:09:08 -06006767 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006768
6769 // Create a buffer with no bound memory and then attempt to create
6770 // a buffer view.
6771 VkBufferCreateInfo buff_ci = {};
6772 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006773 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006774 buff_ci.size = 256;
6775 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6776 VkBuffer buffer;
6777 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6778 ASSERT_VK_SUCCESS(err);
6779
6780 VkBufferViewCreateInfo buff_view_ci = {};
6781 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6782 buff_view_ci.buffer = buffer;
6783 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6784 buff_view_ci.range = VK_WHOLE_SIZE;
6785 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006786 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006787
6788 m_errorMonitor->VerifyFound();
6789 vkDestroyBuffer(m_device->device(), buffer, NULL);
6790 // If last error is success, it still created the view, so delete it.
6791 if (err == VK_SUCCESS) {
6792 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6793 }
6794}
6795
Karl Schultz6addd812016-02-02 17:17:23 -07006796TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6797 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6798 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006799 // 1. No dynamicOffset supplied
6800 // 2. Too many dynamicOffsets supplied
6801 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006802 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6804 " requires 1 dynamicOffsets, but only "
6805 "0 dynamicOffsets are left in "
6806 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006807
Tony Barbour1fa09702017-03-16 12:09:08 -06006808 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006809 ASSERT_NO_FATAL_FAILURE(InitViewport());
6810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6811
6812 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006813 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6814 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006815
6816 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006817 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6818 ds_pool_ci.pNext = NULL;
6819 ds_pool_ci.maxSets = 1;
6820 ds_pool_ci.poolSizeCount = 1;
6821 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006822
6823 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006824 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006825 ASSERT_VK_SUCCESS(err);
6826
6827 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006828 dsl_binding.binding = 0;
6829 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6830 dsl_binding.descriptorCount = 1;
6831 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6832 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006833
6834 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006835 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6836 ds_layout_ci.pNext = NULL;
6837 ds_layout_ci.bindingCount = 1;
6838 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006839 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006840 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006841 ASSERT_VK_SUCCESS(err);
6842
6843 VkDescriptorSet descriptorSet;
6844 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006845 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006846 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006847 alloc_info.descriptorPool = ds_pool;
6848 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006849 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006850 ASSERT_VK_SUCCESS(err);
6851
6852 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006853 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6854 pipeline_layout_ci.pNext = NULL;
6855 pipeline_layout_ci.setLayoutCount = 1;
6856 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006857
6858 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006859 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006860 ASSERT_VK_SUCCESS(err);
6861
6862 // Create a buffer to update the descriptor with
6863 uint32_t qfi = 0;
6864 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006865 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6866 buffCI.size = 1024;
6867 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6868 buffCI.queueFamilyIndexCount = 1;
6869 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006870
6871 VkBuffer dyub;
6872 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6873 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006874 // Allocate memory and bind to buffer so we can make it to the appropriate
6875 // error
6876 VkMemoryAllocateInfo mem_alloc = {};
6877 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6878 mem_alloc.pNext = NULL;
6879 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006880 mem_alloc.memoryTypeIndex = 0;
6881
6882 VkMemoryRequirements memReqs;
6883 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006884 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006885 if (!pass) {
6886 vkDestroyBuffer(m_device->device(), dyub, NULL);
6887 return;
6888 }
6889
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006890 VkDeviceMemory mem;
6891 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6892 ASSERT_VK_SUCCESS(err);
6893 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6894 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006895 // Correctly update descriptor to avoid "NOT_UPDATED" error
6896 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006897 buffInfo.buffer = dyub;
6898 buffInfo.offset = 0;
6899 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006900
6901 VkWriteDescriptorSet descriptor_write;
6902 memset(&descriptor_write, 0, sizeof(descriptor_write));
6903 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6904 descriptor_write.dstSet = descriptorSet;
6905 descriptor_write.dstBinding = 0;
6906 descriptor_write.descriptorCount = 1;
6907 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6908 descriptor_write.pBufferInfo = &buffInfo;
6909
6910 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6911
Tony Barbour552f6c02016-12-21 14:34:07 -07006912 m_commandBuffer->BeginCommandBuffer();
6913 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006914 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6915 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006916 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006917 uint32_t pDynOff[2] = {512, 756};
6918 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6920 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6921 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6922 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006923 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006924 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6926 " dynamic offset 512 combined with "
6927 "offset 0 and range 1024 that "
6928 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006929 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006930 char const *vsSource =
6931 "#version 450\n"
6932 "\n"
6933 "out gl_PerVertex { \n"
6934 " vec4 gl_Position;\n"
6935 "};\n"
6936 "void main(){\n"
6937 " gl_Position = vec4(1);\n"
6938 "}\n";
6939 char const *fsSource =
6940 "#version 450\n"
6941 "\n"
6942 "layout(location=0) out vec4 x;\n"
6943 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6944 "void main(){\n"
6945 " x = vec4(bar.y);\n"
6946 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006947 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6948 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6949 VkPipelineObj pipe(m_device);
6950 pipe.AddShader(&vs);
6951 pipe.AddShader(&fs);
6952 pipe.AddColorAttachment();
6953 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6954
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006955 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6956 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6957 VkRect2D scissor = {{0, 0}, {16, 16}};
6958 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6959
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006960 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006961 // This update should succeed, but offset size of 512 will overstep buffer
6962 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006963 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6964 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006965 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006966 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006967
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006968 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006969 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006970
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006971 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006972 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006973 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6974}
6975
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006976TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006977 TEST_DESCRIPTION(
6978 "Attempt to update a descriptor with a non-sparse buffer "
6979 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006980 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006982 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6984 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006985
Tony Barbour1fa09702017-03-16 12:09:08 -06006986 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006987 ASSERT_NO_FATAL_FAILURE(InitViewport());
6988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6989
6990 VkDescriptorPoolSize ds_type_count = {};
6991 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6992 ds_type_count.descriptorCount = 1;
6993
6994 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6995 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6996 ds_pool_ci.pNext = NULL;
6997 ds_pool_ci.maxSets = 1;
6998 ds_pool_ci.poolSizeCount = 1;
6999 ds_pool_ci.pPoolSizes = &ds_type_count;
7000
7001 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007002 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007003 ASSERT_VK_SUCCESS(err);
7004
7005 VkDescriptorSetLayoutBinding dsl_binding = {};
7006 dsl_binding.binding = 0;
7007 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7008 dsl_binding.descriptorCount = 1;
7009 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7010 dsl_binding.pImmutableSamplers = NULL;
7011
7012 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7013 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7014 ds_layout_ci.pNext = NULL;
7015 ds_layout_ci.bindingCount = 1;
7016 ds_layout_ci.pBindings = &dsl_binding;
7017 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007018 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007019 ASSERT_VK_SUCCESS(err);
7020
7021 VkDescriptorSet descriptorSet;
7022 VkDescriptorSetAllocateInfo alloc_info = {};
7023 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7024 alloc_info.descriptorSetCount = 1;
7025 alloc_info.descriptorPool = ds_pool;
7026 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007027 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007028 ASSERT_VK_SUCCESS(err);
7029
7030 // Create a buffer to update the descriptor with
7031 uint32_t qfi = 0;
7032 VkBufferCreateInfo buffCI = {};
7033 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7034 buffCI.size = 1024;
7035 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7036 buffCI.queueFamilyIndexCount = 1;
7037 buffCI.pQueueFamilyIndices = &qfi;
7038
7039 VkBuffer dyub;
7040 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7041 ASSERT_VK_SUCCESS(err);
7042
7043 // Attempt to update descriptor without binding memory to it
7044 VkDescriptorBufferInfo buffInfo = {};
7045 buffInfo.buffer = dyub;
7046 buffInfo.offset = 0;
7047 buffInfo.range = 1024;
7048
7049 VkWriteDescriptorSet descriptor_write;
7050 memset(&descriptor_write, 0, sizeof(descriptor_write));
7051 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7052 descriptor_write.dstSet = descriptorSet;
7053 descriptor_write.dstBinding = 0;
7054 descriptor_write.descriptorCount = 1;
7055 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7056 descriptor_write.pBufferInfo = &buffInfo;
7057
7058 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7059 m_errorMonitor->VerifyFound();
7060
7061 vkDestroyBuffer(m_device->device(), dyub, NULL);
7062 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7063 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7064}
7065
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007066TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007067 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007068 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007069 ASSERT_NO_FATAL_FAILURE(InitViewport());
7070 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7071
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007072 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007073 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007074 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7075 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7076 pipeline_layout_ci.pushConstantRangeCount = 1;
7077 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7078
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007079 //
7080 // Check for invalid push constant ranges in pipeline layouts.
7081 //
7082 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007083 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007084 char const *msg;
7085 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007086
Karl Schultzc81037d2016-05-12 08:11:23 -06007087 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7088 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7089 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7090 "vkCreatePipelineLayout() call has push constants index 0 with "
7091 "size 0."},
7092 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7093 "vkCreatePipelineLayout() call has push constants index 0 with "
7094 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007095 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007096 "vkCreatePipelineLayout() call has push constants index 0 with "
7097 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007098 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007099 "vkCreatePipelineLayout() call has push constants index 0 with "
7100 "size 0."},
7101 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7102 "vkCreatePipelineLayout() call has push constants index 0 with "
7103 "offset 1. Offset must"},
7104 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7105 "vkCreatePipelineLayout() call has push constants index 0 "
7106 "with offset "},
7107 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7108 "vkCreatePipelineLayout() call has push constants "
7109 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007110 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007111 "vkCreatePipelineLayout() call has push constants index 0 "
7112 "with offset "},
7113 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7114 "vkCreatePipelineLayout() call has push "
7115 "constants index 0 with offset "},
7116 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7117 "vkCreatePipelineLayout() call has push "
7118 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007119 }};
7120
7121 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007122 for (const auto &iter : range_tests) {
7123 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7125 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007126 m_errorMonitor->VerifyFound();
7127 if (VK_SUCCESS == err) {
7128 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7129 }
7130 }
7131
7132 // Check for invalid stage flag
7133 pc_range.offset = 0;
7134 pc_range.size = 16;
7135 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007136 m_errorMonitor->SetDesiredFailureMsg(
7137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7138 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007139 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007140 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007141 if (VK_SUCCESS == err) {
7142 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7143 }
7144
Karl Schultzc59b72d2017-02-24 15:45:05 -07007145 // Check for duplicate stage flags in a list of push constant ranges.
7146 // A shader can only have one push constant block and that block is mapped
7147 // to the push constant range that has that shader's stage flag set.
7148 // The shader's stage flag can only appear once in all the ranges, so the
7149 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007150 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007151 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007152 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007153 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007154 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007155 // Overlapping ranges are OK, but a stage flag can appear only once.
7156 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7157 {
7158 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7159 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7160 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7161 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007162 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007163 {
7164 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7165 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7166 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7167 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7168 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7169 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7170 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7171 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7172 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7173 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7174 }},
7175 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7176 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7177 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7178 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7179 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7180 {
7181 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7182 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7183 }},
7184 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7185 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7186 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7187 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7188 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7189 {
7190 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7191 }},
7192 },
7193 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007194
Karl Schultzc59b72d2017-02-24 15:45:05 -07007195 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007196 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007197 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007199 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007200 m_errorMonitor->VerifyFound();
7201 if (VK_SUCCESS == err) {
7202 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7203 }
7204 }
7205
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007206 //
7207 // CmdPushConstants tests
7208 //
7209
Karl Schultzc59b72d2017-02-24 15:45:05 -07007210 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007211 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007212 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007213 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007214 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007215 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007216 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007217 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007218
7219 const uint8_t dummy_values[100] = {};
7220
7221 m_commandBuffer->BeginCommandBuffer();
7222 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007223
7224 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007225 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007227 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007228 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007229
Karl Schultzc59b72d2017-02-24 15:45:05 -07007230 m_errorMonitor->ExpectSuccess();
7231 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7232 m_errorMonitor->VerifyNotFound();
7233 m_errorMonitor->ExpectSuccess();
7234 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7235 m_errorMonitor->VerifyNotFound();
7236 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7237 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7238 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7239 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7240 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7241 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7242 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007243 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007244 for (const auto &iter : cmd_range_tests) {
7245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7246 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7247 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007248 m_errorMonitor->VerifyFound();
7249 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007250
Tony Barbour552f6c02016-12-21 14:34:07 -07007251 m_commandBuffer->EndRenderPass();
7252 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007253 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007254}
7255
Karl Schultz6addd812016-02-02 17:17:23 -07007256TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007257 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007258 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007259
Tony Barbour1fa09702017-03-16 12:09:08 -06007260 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007261 ASSERT_NO_FATAL_FAILURE(InitViewport());
7262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7263
7264 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7265 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007266 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7267 ds_type_count[0].descriptorCount = 10;
7268 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7269 ds_type_count[1].descriptorCount = 2;
7270 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7271 ds_type_count[2].descriptorCount = 2;
7272 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7273 ds_type_count[3].descriptorCount = 5;
7274 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7275 // type
7276 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7277 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7278 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007279
7280 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007281 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7282 ds_pool_ci.pNext = NULL;
7283 ds_pool_ci.maxSets = 5;
7284 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7285 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007286
7287 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007288 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007289 ASSERT_VK_SUCCESS(err);
7290
7291 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7292 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007293 dsl_binding[0].binding = 0;
7294 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7295 dsl_binding[0].descriptorCount = 5;
7296 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7297 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007298
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007299 // Create layout identical to set0 layout but w/ different stageFlags
7300 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007301 dsl_fs_stage_only.binding = 0;
7302 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7303 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007304 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7305 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007306 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007307 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007308 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7309 ds_layout_ci.pNext = NULL;
7310 ds_layout_ci.bindingCount = 1;
7311 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007312 static const uint32_t NUM_LAYOUTS = 4;
7313 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007314 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007315 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7316 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007317 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007318 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007319 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007320 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007321 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007322 dsl_binding[0].binding = 0;
7323 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007324 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007325 dsl_binding[1].binding = 1;
7326 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7327 dsl_binding[1].descriptorCount = 2;
7328 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7329 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007330 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007331 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007332 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007333 ASSERT_VK_SUCCESS(err);
7334 dsl_binding[0].binding = 0;
7335 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007336 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007337 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007338 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007339 ASSERT_VK_SUCCESS(err);
7340 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007341 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007342 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007343 ASSERT_VK_SUCCESS(err);
7344
7345 static const uint32_t NUM_SETS = 4;
7346 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7347 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007348 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007349 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007350 alloc_info.descriptorPool = ds_pool;
7351 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007352 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007353 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007354 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007355 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007356 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007357 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007358 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007359
7360 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007361 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7362 pipeline_layout_ci.pNext = NULL;
7363 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7364 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007365
7366 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007367 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007368 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007369 // Create pipelineLayout with only one setLayout
7370 pipeline_layout_ci.setLayoutCount = 1;
7371 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007372 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007373 ASSERT_VK_SUCCESS(err);
7374 // Create pipelineLayout with 2 descriptor setLayout at index 0
7375 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7376 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007377 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007378 ASSERT_VK_SUCCESS(err);
7379 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7380 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7381 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007382 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007383 ASSERT_VK_SUCCESS(err);
7384 // Create pipelineLayout with UB type, but stageFlags for FS only
7385 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7386 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007387 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007388 ASSERT_VK_SUCCESS(err);
7389 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7390 VkDescriptorSetLayout pl_bad_s0[2] = {};
7391 pl_bad_s0[0] = ds_layout_fs_only;
7392 pl_bad_s0[1] = ds_layout[1];
7393 pipeline_layout_ci.setLayoutCount = 2;
7394 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7395 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007396 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007397 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007398
Tobin Ehlis88452832015-12-03 09:40:56 -07007399 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007400 char const *vsSource =
7401 "#version 450\n"
7402 "\n"
7403 "out gl_PerVertex {\n"
7404 " vec4 gl_Position;\n"
7405 "};\n"
7406 "void main(){\n"
7407 " gl_Position = vec4(1);\n"
7408 "}\n";
7409 char const *fsSource =
7410 "#version 450\n"
7411 "\n"
7412 "layout(location=0) out vec4 x;\n"
7413 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7414 "void main(){\n"
7415 " x = vec4(bar.y);\n"
7416 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007417 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7418 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007419 VkPipelineObj pipe(m_device);
7420 pipe.AddShader(&vs);
7421 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007422 pipe.AddColorAttachment();
7423 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007424
Tony Barbour552f6c02016-12-21 14:34:07 -07007425 m_commandBuffer->BeginCommandBuffer();
7426 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007427
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007428 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007429 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7430 // of PSO
7431 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7432 // cmd_pipeline.c
7433 // due to the fact that cmd_alloc_dset_data() has not been called in
7434 // cmd_bind_graphics_pipeline()
7435 // TODO : Want to cause various binding incompatibility issues here to test
7436 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007437 // First cause various verify_layout_compatibility() fails
7438 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007439 // verify_set_layout_compatibility fail cases:
7440 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007442 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7443 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007444 m_errorMonitor->VerifyFound();
7445
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007446 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7448 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7449 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007450 m_errorMonitor->VerifyFound();
7451
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007452 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007453 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7454 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7456 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7457 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007458 m_errorMonitor->VerifyFound();
7459
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007460 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7461 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7463 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7464 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007465 m_errorMonitor->VerifyFound();
7466
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007467 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7468 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7470 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7471 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7472 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007473 m_errorMonitor->VerifyFound();
7474
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007475 // Cause INFO messages due to disturbing previously bound Sets
7476 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007477 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7478 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007479 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7481 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7482 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007483 m_errorMonitor->VerifyFound();
7484
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007485 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7486 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007487 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7489 " newly bound as set #0 so set #1 and "
7490 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007491 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7492 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007493 m_errorMonitor->VerifyFound();
7494
Tobin Ehlis10fad692016-07-07 12:00:36 -06007495 // Now that we're done actively using the pipelineLayout that gfx pipeline
7496 // was created with, we should be able to delete it. Do that now to verify
7497 // that validation obeys pipelineLayout lifetime
7498 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7499
Tobin Ehlis88452832015-12-03 09:40:56 -07007500 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007501 // 1. Error due to not binding required set (we actually use same code as
7502 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007503 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7504 &descriptorSet[0], 0, NULL);
7505 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7506 &descriptorSet[1], 0, NULL);
7507 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 -07007508
7509 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7510 VkRect2D scissor = {{0, 0}, {16, 16}};
7511 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7512 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7513
Tobin Ehlis88452832015-12-03 09:40:56 -07007514 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007515 m_errorMonitor->VerifyFound();
7516
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007517 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007518 // 2. Error due to bound set not being compatible with PSO's
7519 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007520 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7521 &descriptorSet[0], 0, NULL);
7522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007523 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007524 m_errorMonitor->VerifyFound();
7525
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007526 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007527 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007528 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7529 }
7530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007531 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7532 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7533}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007534
Karl Schultz6addd812016-02-02 17:17:23 -07007535TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7537 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007538
Tony Barbour1fa09702017-03-16 12:09:08 -06007539 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007540 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007541 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007542 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007543
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007544 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007545}
7546
Karl Schultz6addd812016-02-02 17:17:23 -07007547TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7548 VkResult err;
7549 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007550
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007552
Tony Barbour1fa09702017-03-16 12:09:08 -06007553 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007554
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007555 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007556 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007557 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007558 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007559 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007560 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007561
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007562 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007563 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007564
7565 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007566 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007567 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7568
7569 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007570 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007571 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007572 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 -07007573 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007574
7575 // The error should be caught by validation of the BeginCommandBuffer call
7576 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7577
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007578 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007579 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007580}
7581
Karl Schultz6addd812016-02-02 17:17:23 -07007582TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007583 // Cause error due to Begin while recording CB
7584 // Then cause 2 errors for attempting to reset CB w/o having
7585 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7586 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007588
Tony Barbour1fa09702017-03-16 12:09:08 -06007589 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007590
7591 // Calls AllocateCommandBuffers
7592 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7593
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007594 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007595 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007596 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7597 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007598 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7599 cmd_buf_info.pNext = NULL;
7600 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007601 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007602
7603 // Begin CB to transition to recording state
7604 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7605 // Can't re-begin. This should trigger error
7606 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007607 m_errorMonitor->VerifyFound();
7608
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007610 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007611 // Reset attempt will trigger error due to incorrect CommandPool state
7612 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
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_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007616 // Transition CB to RECORDED state
7617 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7618 // Now attempting to Begin will implicitly reset, which triggers error
7619 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007620 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007621}
7622
Karl Schultz6addd812016-02-02 17:17:23 -07007623TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007624 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007625 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007626
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7628 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007629
Tony Barbour1fa09702017-03-16 12:09:08 -06007630 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007631 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007632
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007633 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007634 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7635 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007636
7637 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007638 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7639 ds_pool_ci.pNext = NULL;
7640 ds_pool_ci.maxSets = 1;
7641 ds_pool_ci.poolSizeCount = 1;
7642 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007643
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007644 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007645 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007646 ASSERT_VK_SUCCESS(err);
7647
Tony Barboureb254902015-07-15 12:50:33 -06007648 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007649 dsl_binding.binding = 0;
7650 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7651 dsl_binding.descriptorCount = 1;
7652 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7653 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007654
Tony Barboureb254902015-07-15 12:50:33 -06007655 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007656 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7657 ds_layout_ci.pNext = NULL;
7658 ds_layout_ci.bindingCount = 1;
7659 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007660
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007661 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007662 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007663 ASSERT_VK_SUCCESS(err);
7664
7665 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007666 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007667 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007668 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007669 alloc_info.descriptorPool = ds_pool;
7670 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007671 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007672 ASSERT_VK_SUCCESS(err);
7673
Tony Barboureb254902015-07-15 12:50:33 -06007674 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007675 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7676 pipeline_layout_ci.setLayoutCount = 1;
7677 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007678
7679 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007680 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007681 ASSERT_VK_SUCCESS(err);
7682
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007683 VkViewport vp = {}; // Just need dummy vp to point to
7684 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007685
7686 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007687 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7688 vp_state_ci.scissorCount = 1;
7689 vp_state_ci.pScissors = &sc;
7690 vp_state_ci.viewportCount = 1;
7691 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007692
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007693 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7694 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7695 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7696 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7697 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7698 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007699 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007700 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007701 rs_state_ci.lineWidth = 1.0f;
7702
7703 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7704 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7705 vi_ci.pNext = nullptr;
7706 vi_ci.vertexBindingDescriptionCount = 0;
7707 vi_ci.pVertexBindingDescriptions = nullptr;
7708 vi_ci.vertexAttributeDescriptionCount = 0;
7709 vi_ci.pVertexAttributeDescriptions = nullptr;
7710
7711 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7712 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7713 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7714
7715 VkPipelineShaderStageCreateInfo shaderStages[2];
7716 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7717
7718 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7719 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007720 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007721 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007722
Tony Barboureb254902015-07-15 12:50:33 -06007723 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007724 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7725 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007726 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007727 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7728 gp_ci.layout = pipeline_layout;
7729 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007730 gp_ci.pVertexInputState = &vi_ci;
7731 gp_ci.pInputAssemblyState = &ia_ci;
7732
7733 gp_ci.stageCount = 1;
7734 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007735
7736 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007737 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7738 pc_ci.initialDataSize = 0;
7739 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007740
7741 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007742 VkPipelineCache pipelineCache;
7743
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007744 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007745 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007746 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007747 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007748
Chia-I Wuf7458c52015-10-26 21:10:41 +08007749 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7750 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7751 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7752 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007753}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007754
Tobin Ehlis912df022015-09-17 08:46:18 -06007755/*// TODO : This test should be good, but needs Tess support in compiler to run
7756TEST_F(VkLayerTest, InvalidPatchControlPoints)
7757{
7758 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007759 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007760
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007762 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7763primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007764
Tony Barbour1fa09702017-03-16 12:09:08 -06007765 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007766 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007767
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007768 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007769 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007770 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007771
7772 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7773 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7774 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007775 ds_pool_ci.poolSizeCount = 1;
7776 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007777
7778 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007779 err = vkCreateDescriptorPool(m_device->device(),
7780VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007781 ASSERT_VK_SUCCESS(err);
7782
7783 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007784 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007785 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007786 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007787 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7788 dsl_binding.pImmutableSamplers = NULL;
7789
7790 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007791 ds_layout_ci.sType =
7792VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007793 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007794 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007795 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007796
7797 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7799&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007800 ASSERT_VK_SUCCESS(err);
7801
7802 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007803 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7804VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007805 ASSERT_VK_SUCCESS(err);
7806
7807 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007808 pipeline_layout_ci.sType =
7809VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007810 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007811 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007812 pipeline_layout_ci.pSetLayouts = &ds_layout;
7813
7814 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007815 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7816&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007817 ASSERT_VK_SUCCESS(err);
7818
7819 VkPipelineShaderStageCreateInfo shaderStages[3];
7820 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7821
Karl Schultz6addd812016-02-02 17:17:23 -07007822 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7823this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007824 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007825 VkShaderObj
7826tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7827this);
7828 VkShaderObj
7829te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7830this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007831
Karl Schultz6addd812016-02-02 17:17:23 -07007832 shaderStages[0].sType =
7833VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007834 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007835 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007836 shaderStages[1].sType =
7837VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007838 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007839 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007840 shaderStages[2].sType =
7841VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007842 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007843 shaderStages[2].shader = te.handle();
7844
7845 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007846 iaCI.sType =
7847VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007848 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007849
7850 VkPipelineTessellationStateCreateInfo tsCI = {};
7851 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7852 tsCI.patchControlPoints = 0; // This will cause an error
7853
7854 VkGraphicsPipelineCreateInfo gp_ci = {};
7855 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7856 gp_ci.pNext = NULL;
7857 gp_ci.stageCount = 3;
7858 gp_ci.pStages = shaderStages;
7859 gp_ci.pVertexInputState = NULL;
7860 gp_ci.pInputAssemblyState = &iaCI;
7861 gp_ci.pTessellationState = &tsCI;
7862 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007863 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007864 gp_ci.pMultisampleState = NULL;
7865 gp_ci.pDepthStencilState = NULL;
7866 gp_ci.pColorBlendState = NULL;
7867 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7868 gp_ci.layout = pipeline_layout;
7869 gp_ci.renderPass = renderPass();
7870
7871 VkPipelineCacheCreateInfo pc_ci = {};
7872 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7873 pc_ci.pNext = NULL;
7874 pc_ci.initialSize = 0;
7875 pc_ci.initialData = 0;
7876 pc_ci.maxSize = 0;
7877
7878 VkPipeline pipeline;
7879 VkPipelineCache pipelineCache;
7880
Karl Schultz6addd812016-02-02 17:17:23 -07007881 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7882&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007883 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007884 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7885&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007886
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007887 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007888
Chia-I Wuf7458c52015-10-26 21:10:41 +08007889 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7890 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7891 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7892 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007893}
7894*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007895
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007896TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007897 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007898
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007899 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007900
Tony Barbour1fa09702017-03-16 12:09:08 -06007901 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007902 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007903
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007904 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007905 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7906 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007907
7908 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007909 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7910 ds_pool_ci.maxSets = 1;
7911 ds_pool_ci.poolSizeCount = 1;
7912 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007913
7914 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007915 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007916 ASSERT_VK_SUCCESS(err);
7917
7918 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007919 dsl_binding.binding = 0;
7920 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7921 dsl_binding.descriptorCount = 1;
7922 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007923
7924 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007925 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7926 ds_layout_ci.bindingCount = 1;
7927 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007928
7929 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007930 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007931 ASSERT_VK_SUCCESS(err);
7932
7933 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007934 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007935 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007936 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007937 alloc_info.descriptorPool = ds_pool;
7938 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007939 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007940 ASSERT_VK_SUCCESS(err);
7941
7942 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007943 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7944 pipeline_layout_ci.setLayoutCount = 1;
7945 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007946
7947 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007948 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007949 ASSERT_VK_SUCCESS(err);
7950
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007951 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007952 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007953 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007954 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007955 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007956 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007957
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007958 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7959 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7960 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7961 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7962 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7963 rs_state_ci.depthClampEnable = VK_FALSE;
7964 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7965 rs_state_ci.depthBiasEnable = VK_FALSE;
7966
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007967 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7968 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7969 vi_ci.pNext = nullptr;
7970 vi_ci.vertexBindingDescriptionCount = 0;
7971 vi_ci.pVertexBindingDescriptions = nullptr;
7972 vi_ci.vertexAttributeDescriptionCount = 0;
7973 vi_ci.pVertexAttributeDescriptions = nullptr;
7974
7975 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7976 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7977 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7978
7979 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7980 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7981 pipe_ms_state_ci.pNext = NULL;
7982 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7983 pipe_ms_state_ci.sampleShadingEnable = 0;
7984 pipe_ms_state_ci.minSampleShading = 1.0;
7985 pipe_ms_state_ci.pSampleMask = NULL;
7986
Cody Northropeb3a6c12015-10-05 14:44:45 -06007987 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007988 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007989
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007990 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007991 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007992 shaderStages[0] = vs.GetStageCreateInfo();
7993 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007994
7995 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007996 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7997 gp_ci.stageCount = 2;
7998 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007999 gp_ci.pVertexInputState = &vi_ci;
8000 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008001 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008002 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008003 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008004 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8005 gp_ci.layout = pipeline_layout;
8006 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008007
8008 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008009 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008010
8011 VkPipeline pipeline;
8012 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008013 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008014 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008015
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008016 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008017 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008018
8019 // Check case where multiViewport is disabled and viewport count is not 1
8020 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8021 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
8022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
8023 vp_state_ci.scissorCount = 0;
8024 vp_state_ci.viewportCount = 0;
8025 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8026 m_errorMonitor->VerifyFound();
8027 } else {
8028 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008029 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008030 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008031 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008032
8033 // Check is that viewportcount and scissorcount match
8034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
8035 vp_state_ci.scissorCount = 1;
8036 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8037 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8038 m_errorMonitor->VerifyFound();
8039
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008040 // Check case where multiViewport is enabled and viewport count is greater than max
8041 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8044 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8045 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8046 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8047 m_errorMonitor->VerifyFound();
8048 }
8049 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008050
Chia-I Wuf7458c52015-10-26 21:10:41 +08008051 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8052 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8053 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8054 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008055}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008056
8057// 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
8058// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008059TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008060 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008061
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008062 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8063
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008065
Tony Barbour1fa09702017-03-16 12:09:08 -06008066 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008068
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008069 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008070 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8071 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008072
8073 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008074 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8075 ds_pool_ci.maxSets = 1;
8076 ds_pool_ci.poolSizeCount = 1;
8077 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008078
8079 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008080 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008081 ASSERT_VK_SUCCESS(err);
8082
8083 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008084 dsl_binding.binding = 0;
8085 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8086 dsl_binding.descriptorCount = 1;
8087 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008088
8089 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008090 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8091 ds_layout_ci.bindingCount = 1;
8092 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008093
8094 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008095 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008096 ASSERT_VK_SUCCESS(err);
8097
8098 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008099 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008100 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008101 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008102 alloc_info.descriptorPool = ds_pool;
8103 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008104 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008105 ASSERT_VK_SUCCESS(err);
8106
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008107 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8108 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8109 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8110
8111 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8112 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8113 vi_ci.pNext = nullptr;
8114 vi_ci.vertexBindingDescriptionCount = 0;
8115 vi_ci.pVertexBindingDescriptions = nullptr;
8116 vi_ci.vertexAttributeDescriptionCount = 0;
8117 vi_ci.pVertexAttributeDescriptions = nullptr;
8118
8119 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8120 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8121 pipe_ms_state_ci.pNext = NULL;
8122 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8123 pipe_ms_state_ci.sampleShadingEnable = 0;
8124 pipe_ms_state_ci.minSampleShading = 1.0;
8125 pipe_ms_state_ci.pSampleMask = NULL;
8126
Tobin Ehlise68360f2015-10-01 11:15:13 -06008127 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008128 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8129 pipeline_layout_ci.setLayoutCount = 1;
8130 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008131
8132 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008133 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008134 ASSERT_VK_SUCCESS(err);
8135
8136 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8137 // Set scissor as dynamic to avoid second error
8138 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008139 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8140 dyn_state_ci.dynamicStateCount = 1;
8141 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008142
Cody Northropeb3a6c12015-10-05 14:44:45 -06008143 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008144 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008145
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008146 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008147 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8148 // 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 +08008149 shaderStages[0] = vs.GetStageCreateInfo();
8150 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008152 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8153 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8154 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8155 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8156 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8157 rs_state_ci.depthClampEnable = VK_FALSE;
8158 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8159 rs_state_ci.depthBiasEnable = VK_FALSE;
8160
Tobin Ehlise68360f2015-10-01 11:15:13 -06008161 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008162 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8163 gp_ci.stageCount = 2;
8164 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008165 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008166 // Not setting VP state w/o dynamic vp state should cause validation error
8167 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008168 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008169 gp_ci.pVertexInputState = &vi_ci;
8170 gp_ci.pInputAssemblyState = &ia_ci;
8171 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008172 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8173 gp_ci.layout = pipeline_layout;
8174 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008175
8176 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008177 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008178
8179 VkPipeline pipeline;
8180 VkPipelineCache pipelineCache;
8181
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008182 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008183 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008184 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008186 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008187
Chia-I Wuf7458c52015-10-26 21:10:41 +08008188 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8189 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8190 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8191 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008192}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008193
8194// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8195// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008196TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8197 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008198
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008200
Tony Barbour1fa09702017-03-16 12:09:08 -06008201 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008202
8203 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008204 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008205 return;
8206 }
8207
Tobin Ehlise68360f2015-10-01 11:15:13 -06008208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008209
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008210 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008211 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8212 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008213
8214 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008215 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8216 ds_pool_ci.maxSets = 1;
8217 ds_pool_ci.poolSizeCount = 1;
8218 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008219
8220 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008221 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008222 ASSERT_VK_SUCCESS(err);
8223
8224 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008225 dsl_binding.binding = 0;
8226 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8227 dsl_binding.descriptorCount = 1;
8228 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008229
8230 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008231 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8232 ds_layout_ci.bindingCount = 1;
8233 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008234
8235 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008236 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008237 ASSERT_VK_SUCCESS(err);
8238
8239 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008240 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008241 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008242 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008243 alloc_info.descriptorPool = ds_pool;
8244 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008245 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008246 ASSERT_VK_SUCCESS(err);
8247
8248 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008249 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8250 pipeline_layout_ci.setLayoutCount = 1;
8251 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008252
8253 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008254 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008255 ASSERT_VK_SUCCESS(err);
8256
8257 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008258 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8259 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008260 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008261 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008262 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008263
8264 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8265 // Set scissor as dynamic to avoid that error
8266 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008267 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8268 dyn_state_ci.dynamicStateCount = 1;
8269 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008270
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008271 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8272 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8273 pipe_ms_state_ci.pNext = NULL;
8274 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8275 pipe_ms_state_ci.sampleShadingEnable = 0;
8276 pipe_ms_state_ci.minSampleShading = 1.0;
8277 pipe_ms_state_ci.pSampleMask = NULL;
8278
Cody Northropeb3a6c12015-10-05 14:44:45 -06008279 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008280 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008281
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008282 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008283 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8284 // 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 +08008285 shaderStages[0] = vs.GetStageCreateInfo();
8286 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008287
Cody Northropf6622dc2015-10-06 10:33:21 -06008288 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8289 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8290 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008291 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008292 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008293 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008294 vi_ci.pVertexAttributeDescriptions = nullptr;
8295
8296 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8297 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8298 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8299
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008300 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008301 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008302 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008303 rs_ci.pNext = nullptr;
8304
Mark Youngc89c6312016-03-31 16:03:20 -06008305 VkPipelineColorBlendAttachmentState att = {};
8306 att.blendEnable = VK_FALSE;
8307 att.colorWriteMask = 0xf;
8308
Cody Northropf6622dc2015-10-06 10:33:21 -06008309 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8310 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8311 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008312 cb_ci.attachmentCount = 1;
8313 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008314
Tobin Ehlise68360f2015-10-01 11:15:13 -06008315 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008316 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8317 gp_ci.stageCount = 2;
8318 gp_ci.pStages = shaderStages;
8319 gp_ci.pVertexInputState = &vi_ci;
8320 gp_ci.pInputAssemblyState = &ia_ci;
8321 gp_ci.pViewportState = &vp_state_ci;
8322 gp_ci.pRasterizationState = &rs_ci;
8323 gp_ci.pColorBlendState = &cb_ci;
8324 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008325 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008326 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8327 gp_ci.layout = pipeline_layout;
8328 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008329
8330 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008331 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008332
8333 VkPipeline pipeline;
8334 VkPipelineCache pipelineCache;
8335
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008336 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008337 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008338 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008339
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008340 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008341
Tobin Ehlisd332f282015-10-02 11:00:56 -06008342 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008343 // First need to successfully create the PSO from above by setting
8344 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008345 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 -07008346
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008347 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008348 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008349 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008350 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008351 m_commandBuffer->BeginCommandBuffer();
8352 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008353 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008354 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008355 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008356 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008357 Draw(1, 0, 0, 0);
8358
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008359 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008360
8361 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8362 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8363 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8364 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008365 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008366}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008367
8368// 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 -07008369// viewportCount
8370TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8371 VkResult err;
8372
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008374
Tony Barbour1fa09702017-03-16 12:09:08 -06008375 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008376
8377 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008378 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008379 return;
8380 }
8381
Karl Schultz6addd812016-02-02 17:17:23 -07008382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8383
8384 VkDescriptorPoolSize ds_type_count = {};
8385 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8386 ds_type_count.descriptorCount = 1;
8387
8388 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8389 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8390 ds_pool_ci.maxSets = 1;
8391 ds_pool_ci.poolSizeCount = 1;
8392 ds_pool_ci.pPoolSizes = &ds_type_count;
8393
8394 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008395 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008396 ASSERT_VK_SUCCESS(err);
8397
8398 VkDescriptorSetLayoutBinding dsl_binding = {};
8399 dsl_binding.binding = 0;
8400 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8401 dsl_binding.descriptorCount = 1;
8402 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8403
8404 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8405 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8406 ds_layout_ci.bindingCount = 1;
8407 ds_layout_ci.pBindings = &dsl_binding;
8408
8409 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008410 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008411 ASSERT_VK_SUCCESS(err);
8412
8413 VkDescriptorSet descriptorSet;
8414 VkDescriptorSetAllocateInfo alloc_info = {};
8415 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8416 alloc_info.descriptorSetCount = 1;
8417 alloc_info.descriptorPool = ds_pool;
8418 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008419 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008420 ASSERT_VK_SUCCESS(err);
8421
8422 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8423 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8424 pipeline_layout_ci.setLayoutCount = 1;
8425 pipeline_layout_ci.pSetLayouts = &ds_layout;
8426
8427 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008428 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008429 ASSERT_VK_SUCCESS(err);
8430
8431 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8432 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8433 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008434 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008435 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008436 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008437
8438 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8439 // Set scissor as dynamic to avoid that error
8440 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8441 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8442 dyn_state_ci.dynamicStateCount = 1;
8443 dyn_state_ci.pDynamicStates = &vp_state;
8444
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008445 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8446 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8447 pipe_ms_state_ci.pNext = NULL;
8448 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8449 pipe_ms_state_ci.sampleShadingEnable = 0;
8450 pipe_ms_state_ci.minSampleShading = 1.0;
8451 pipe_ms_state_ci.pSampleMask = NULL;
8452
Karl Schultz6addd812016-02-02 17:17:23 -07008453 VkPipelineShaderStageCreateInfo shaderStages[2];
8454 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8455
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008456 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008457 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8458 // 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 -07008459 shaderStages[0] = vs.GetStageCreateInfo();
8460 shaderStages[1] = fs.GetStageCreateInfo();
8461
8462 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8463 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8464 vi_ci.pNext = nullptr;
8465 vi_ci.vertexBindingDescriptionCount = 0;
8466 vi_ci.pVertexBindingDescriptions = nullptr;
8467 vi_ci.vertexAttributeDescriptionCount = 0;
8468 vi_ci.pVertexAttributeDescriptions = nullptr;
8469
8470 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8471 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8472 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8473
8474 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8475 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008476 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008477 rs_ci.pNext = nullptr;
8478
Mark Youngc89c6312016-03-31 16:03:20 -06008479 VkPipelineColorBlendAttachmentState att = {};
8480 att.blendEnable = VK_FALSE;
8481 att.colorWriteMask = 0xf;
8482
Karl Schultz6addd812016-02-02 17:17:23 -07008483 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8484 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8485 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008486 cb_ci.attachmentCount = 1;
8487 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008488
8489 VkGraphicsPipelineCreateInfo gp_ci = {};
8490 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8491 gp_ci.stageCount = 2;
8492 gp_ci.pStages = shaderStages;
8493 gp_ci.pVertexInputState = &vi_ci;
8494 gp_ci.pInputAssemblyState = &ia_ci;
8495 gp_ci.pViewportState = &vp_state_ci;
8496 gp_ci.pRasterizationState = &rs_ci;
8497 gp_ci.pColorBlendState = &cb_ci;
8498 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008499 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008500 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8501 gp_ci.layout = pipeline_layout;
8502 gp_ci.renderPass = renderPass();
8503
8504 VkPipelineCacheCreateInfo pc_ci = {};
8505 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8506
8507 VkPipeline pipeline;
8508 VkPipelineCache pipelineCache;
8509
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008510 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008511 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008512 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008513
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008514 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008515
8516 // Now hit second fail case where we set scissor w/ different count than PSO
8517 // First need to successfully create the PSO from above by setting
8518 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8520 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008521
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008522 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008523 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008524 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008525 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008526 m_commandBuffer->BeginCommandBuffer();
8527 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008528 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008529 VkViewport viewports[1] = {};
8530 viewports[0].width = 8;
8531 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008532 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008533 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008534 Draw(1, 0, 0, 0);
8535
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008536 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008537
Chia-I Wuf7458c52015-10-26 21:10:41 +08008538 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8539 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8540 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8541 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008542 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008543}
8544
Mark Young7394fdd2016-03-31 14:56:43 -06008545TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8546 VkResult err;
8547
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008549
Tony Barbour1fa09702017-03-16 12:09:08 -06008550 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8552
8553 VkDescriptorPoolSize ds_type_count = {};
8554 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8555 ds_type_count.descriptorCount = 1;
8556
8557 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8558 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8559 ds_pool_ci.maxSets = 1;
8560 ds_pool_ci.poolSizeCount = 1;
8561 ds_pool_ci.pPoolSizes = &ds_type_count;
8562
8563 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008564 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008565 ASSERT_VK_SUCCESS(err);
8566
8567 VkDescriptorSetLayoutBinding dsl_binding = {};
8568 dsl_binding.binding = 0;
8569 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8570 dsl_binding.descriptorCount = 1;
8571 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8572
8573 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8574 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8575 ds_layout_ci.bindingCount = 1;
8576 ds_layout_ci.pBindings = &dsl_binding;
8577
8578 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008579 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008580 ASSERT_VK_SUCCESS(err);
8581
8582 VkDescriptorSet descriptorSet;
8583 VkDescriptorSetAllocateInfo alloc_info = {};
8584 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8585 alloc_info.descriptorSetCount = 1;
8586 alloc_info.descriptorPool = ds_pool;
8587 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008588 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008589 ASSERT_VK_SUCCESS(err);
8590
8591 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8592 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8593 pipeline_layout_ci.setLayoutCount = 1;
8594 pipeline_layout_ci.pSetLayouts = &ds_layout;
8595
8596 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008597 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008598 ASSERT_VK_SUCCESS(err);
8599
8600 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8601 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8602 vp_state_ci.scissorCount = 1;
8603 vp_state_ci.pScissors = NULL;
8604 vp_state_ci.viewportCount = 1;
8605 vp_state_ci.pViewports = NULL;
8606
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008607 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008608 // Set scissor as dynamic to avoid that error
8609 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8610 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8611 dyn_state_ci.dynamicStateCount = 2;
8612 dyn_state_ci.pDynamicStates = dynamic_states;
8613
8614 VkPipelineShaderStageCreateInfo shaderStages[2];
8615 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8616
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008617 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8618 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008619 this); // TODO - We shouldn't need a fragment shader
8620 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008621 shaderStages[0] = vs.GetStageCreateInfo();
8622 shaderStages[1] = fs.GetStageCreateInfo();
8623
8624 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8625 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8626 vi_ci.pNext = nullptr;
8627 vi_ci.vertexBindingDescriptionCount = 0;
8628 vi_ci.pVertexBindingDescriptions = nullptr;
8629 vi_ci.vertexAttributeDescriptionCount = 0;
8630 vi_ci.pVertexAttributeDescriptions = nullptr;
8631
8632 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8633 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8634 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8635
8636 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8637 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8638 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008639 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008640
Mark Young47107952016-05-02 15:59:55 -06008641 // Check too low (line width of -1.0f).
8642 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008643
8644 VkPipelineColorBlendAttachmentState att = {};
8645 att.blendEnable = VK_FALSE;
8646 att.colorWriteMask = 0xf;
8647
8648 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8649 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8650 cb_ci.pNext = nullptr;
8651 cb_ci.attachmentCount = 1;
8652 cb_ci.pAttachments = &att;
8653
8654 VkGraphicsPipelineCreateInfo gp_ci = {};
8655 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8656 gp_ci.stageCount = 2;
8657 gp_ci.pStages = shaderStages;
8658 gp_ci.pVertexInputState = &vi_ci;
8659 gp_ci.pInputAssemblyState = &ia_ci;
8660 gp_ci.pViewportState = &vp_state_ci;
8661 gp_ci.pRasterizationState = &rs_ci;
8662 gp_ci.pColorBlendState = &cb_ci;
8663 gp_ci.pDynamicState = &dyn_state_ci;
8664 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8665 gp_ci.layout = pipeline_layout;
8666 gp_ci.renderPass = renderPass();
8667
8668 VkPipelineCacheCreateInfo pc_ci = {};
8669 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8670
8671 VkPipeline pipeline;
8672 VkPipelineCache pipelineCache;
8673
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008674 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008675 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008676 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008677
8678 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008679 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008680
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008682
8683 // Check too high (line width of 65536.0f).
8684 rs_ci.lineWidth = 65536.0f;
8685
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008686 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008687 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008688 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008689
8690 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008691 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008692
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008694
8695 dyn_state_ci.dynamicStateCount = 3;
8696
8697 rs_ci.lineWidth = 1.0f;
8698
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008699 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008700 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008701 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008702 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008703 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008704
8705 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008706 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008707 m_errorMonitor->VerifyFound();
8708
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008710
8711 // Check too high with dynamic setting.
8712 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8713 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008714 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008715
8716 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8717 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8718 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8719 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008720 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008721}
8722
Karl Schultz6addd812016-02-02 17:17:23 -07008723TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008724 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008726 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008727
Tony Barbour1fa09702017-03-16 12:09:08 -06008728 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008729 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008730
Tony Barbour552f6c02016-12-21 14:34:07 -07008731 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008732 // Don't care about RenderPass handle b/c error should be flagged before
8733 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008734 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008735
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008736 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008737}
8738
Karl Schultz6addd812016-02-02 17:17:23 -07008739TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008740 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8742 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008743
Tony Barbour1fa09702017-03-16 12:09:08 -06008744 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008746
Tony Barbour552f6c02016-12-21 14:34:07 -07008747 m_commandBuffer->BeginCommandBuffer();
8748 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008749 // Just create a dummy Renderpass that's non-NULL so we can get to the
8750 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008751 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008752
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008753 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008754}
8755
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008756TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008757 TEST_DESCRIPTION(
8758 "Begin a renderPass where clearValueCount is less than"
8759 "the number of renderPass attachments that use loadOp"
8760 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008761
Tony Barbour1fa09702017-03-16 12:09:08 -06008762 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8764
8765 // Create a renderPass with a single attachment that uses loadOp CLEAR
8766 VkAttachmentReference attach = {};
8767 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8768 VkSubpassDescription subpass = {};
8769 subpass.inputAttachmentCount = 1;
8770 subpass.pInputAttachments = &attach;
8771 VkRenderPassCreateInfo rpci = {};
8772 rpci.subpassCount = 1;
8773 rpci.pSubpasses = &subpass;
8774 rpci.attachmentCount = 1;
8775 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008776 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008777 // Set loadOp to CLEAR
8778 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8779 rpci.pAttachments = &attach_desc;
8780 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8781 VkRenderPass rp;
8782 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8783
8784 VkCommandBufferInheritanceInfo hinfo = {};
8785 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8786 hinfo.renderPass = VK_NULL_HANDLE;
8787 hinfo.subpass = 0;
8788 hinfo.framebuffer = VK_NULL_HANDLE;
8789 hinfo.occlusionQueryEnable = VK_FALSE;
8790 hinfo.queryFlags = 0;
8791 hinfo.pipelineStatistics = 0;
8792 VkCommandBufferBeginInfo info = {};
8793 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8794 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8795 info.pInheritanceInfo = &hinfo;
8796
8797 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8798 VkRenderPassBeginInfo rp_begin = {};
8799 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8800 rp_begin.pNext = NULL;
8801 rp_begin.renderPass = renderPass();
8802 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008803 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008804
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008806
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008807 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008808
8809 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008810
8811 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008812}
8813
Slawomir Cygan0808f392016-11-28 17:53:23 +01008814TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008815 TEST_DESCRIPTION(
8816 "Begin a renderPass where clearValueCount is greater than"
8817 "the number of renderPass attachments that use loadOp"
8818 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008819
Tony Barbour1fa09702017-03-16 12:09:08 -06008820 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008821 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8822
8823 // Create a renderPass with a single attachment that uses loadOp CLEAR
8824 VkAttachmentReference attach = {};
8825 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8826 VkSubpassDescription subpass = {};
8827 subpass.inputAttachmentCount = 1;
8828 subpass.pInputAttachments = &attach;
8829 VkRenderPassCreateInfo rpci = {};
8830 rpci.subpassCount = 1;
8831 rpci.pSubpasses = &subpass;
8832 rpci.attachmentCount = 1;
8833 VkAttachmentDescription attach_desc = {};
8834 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8835 // Set loadOp to CLEAR
8836 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8837 rpci.pAttachments = &attach_desc;
8838 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8839 VkRenderPass rp;
8840 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8841
8842 VkCommandBufferBeginInfo info = {};
8843 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8844 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8845
8846 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8847 VkRenderPassBeginInfo rp_begin = {};
8848 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8849 rp_begin.pNext = NULL;
8850 rp_begin.renderPass = renderPass();
8851 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008852 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008853
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8855 " has a clearValueCount of"
8856 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008857
8858 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8859
8860 m_errorMonitor->VerifyFound();
8861
8862 vkDestroyRenderPass(m_device->device(), rp, NULL);
8863}
8864
Cody Northrop3bb4d962016-05-09 16:15:57 -06008865TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008866 TEST_DESCRIPTION("End a command buffer with an active render pass");
8867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8869 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008870
Tony Barbour1fa09702017-03-16 12:09:08 -06008871 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008872 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8873
Tony Barbour552f6c02016-12-21 14:34:07 -07008874 m_commandBuffer->BeginCommandBuffer();
8875 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8876 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008877
8878 m_errorMonitor->VerifyFound();
8879
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008880 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8881 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008882}
8883
Karl Schultz6addd812016-02-02 17:17:23 -07008884TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008885 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8887 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008888
Tony Barbour1fa09702017-03-16 12:09:08 -06008889 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008890 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008891
Tony Barbour552f6c02016-12-21 14:34:07 -07008892 m_commandBuffer->BeginCommandBuffer();
8893 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008894
8895 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008896 vk_testing::Buffer dstBuffer;
8897 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008898
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008899 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008900
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008901 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008902}
8903
Karl Schultz6addd812016-02-02 17:17:23 -07008904TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008905 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8907 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008908
Tony Barbour1fa09702017-03-16 12:09:08 -06008909 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008910 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008911
Tony Barbour552f6c02016-12-21 14:34:07 -07008912 m_commandBuffer->BeginCommandBuffer();
8913 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008914
8915 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008916 vk_testing::Buffer dstBuffer;
8917 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008918
Karl Schultz6addd812016-02-02 17:17:23 -07008919 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008920 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8921 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8922 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008923
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008924 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008925}
8926
Karl Schultz6addd812016-02-02 17:17:23 -07008927TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008928 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8930 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008931
Tony Barbour1fa09702017-03-16 12:09:08 -06008932 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008933 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008934
Tony Barbour552f6c02016-12-21 14:34:07 -07008935 m_commandBuffer->BeginCommandBuffer();
8936 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008937
Michael Lentine0a369f62016-02-03 16:51:46 -06008938 VkClearColorValue clear_color;
8939 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008940 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8941 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8942 const int32_t tex_width = 32;
8943 const int32_t tex_height = 32;
8944 VkImageCreateInfo image_create_info = {};
8945 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8946 image_create_info.pNext = NULL;
8947 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8948 image_create_info.format = tex_format;
8949 image_create_info.extent.width = tex_width;
8950 image_create_info.extent.height = tex_height;
8951 image_create_info.extent.depth = 1;
8952 image_create_info.mipLevels = 1;
8953 image_create_info.arrayLayers = 1;
8954 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8955 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008956 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008957
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008958 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008959 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008960
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008961 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008962
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008963 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008964
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008965 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008966}
8967
Karl Schultz6addd812016-02-02 17:17:23 -07008968TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008969 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8971 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008972
Tony Barbour1fa09702017-03-16 12:09:08 -06008973 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008974 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008975
Dave Houlton1d2022c2017-03-29 11:43:58 -06008976 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008977 if (!depth_format) {
8978 printf(" No Depth + Stencil format found. Skipped.\n");
8979 return;
8980 }
8981
Tony Barbour552f6c02016-12-21 14:34:07 -07008982 m_commandBuffer->BeginCommandBuffer();
8983 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008984
8985 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008986 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008987 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8988 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008989 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008990 image_create_info.extent.width = 64;
8991 image_create_info.extent.height = 64;
8992 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8993 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008994
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008995 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008996 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008997
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008998 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008999
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009000 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9001 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009002
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009003 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009004}
9005
Karl Schultz6addd812016-02-02 17:17:23 -07009006TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009007 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009008 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009009
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9011 "vkCmdClearAttachments(): This call "
9012 "must be issued inside an active "
9013 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009014
Tony Barbour1fa09702017-03-16 12:09:08 -06009015 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009016 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009017
9018 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009019 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009020 ASSERT_VK_SUCCESS(err);
9021
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009022 VkClearAttachment color_attachment;
9023 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9024 color_attachment.clearValue.color.float32[0] = 0;
9025 color_attachment.clearValue.color.float32[1] = 0;
9026 color_attachment.clearValue.color.float32[2] = 0;
9027 color_attachment.clearValue.color.float32[3] = 0;
9028 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009029 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009030 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009031
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009032 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009033}
9034
Chris Forbes3b97e932016-09-07 11:29:24 +12009035TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009036 TEST_DESCRIPTION(
9037 "Test that an error is produced when CmdNextSubpass is "
9038 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009039
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9041 "vkCmdNextSubpass(): Attempted to advance "
9042 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009043
Tony Barbour1fa09702017-03-16 12:09:08 -06009044 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9046
Tony Barbour552f6c02016-12-21 14:34:07 -07009047 m_commandBuffer->BeginCommandBuffer();
9048 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009049
9050 // error here.
9051 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9052 m_errorMonitor->VerifyFound();
9053
Tony Barbour552f6c02016-12-21 14:34:07 -07009054 m_commandBuffer->EndRenderPass();
9055 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009056}
9057
Chris Forbes6d624702016-09-07 13:57:05 +12009058TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009059 TEST_DESCRIPTION(
9060 "Test that an error is produced when CmdEndRenderPass is "
9061 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009062
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9064 "vkCmdEndRenderPass(): Called before reaching "
9065 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009066
Tony Barbour1fa09702017-03-16 12:09:08 -06009067 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009068 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9069 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009070
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009071 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009072
9073 VkRenderPass rp;
9074 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9075 ASSERT_VK_SUCCESS(err);
9076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009077 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009078
9079 VkFramebuffer fb;
9080 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9081 ASSERT_VK_SUCCESS(err);
9082
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009083 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009084
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009085 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 +12009086
9087 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9088
9089 // Error here.
9090 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9091 m_errorMonitor->VerifyFound();
9092
9093 // Clean up.
9094 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9095 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9096}
9097
Karl Schultz9e66a292016-04-21 15:57:51 -06009098TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9099 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9101 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009102
Tony Barbour1fa09702017-03-16 12:09:08 -06009103 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009104 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009105
9106 VkBufferMemoryBarrier buf_barrier = {};
9107 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9108 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9109 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9110 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9111 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9112 buf_barrier.buffer = VK_NULL_HANDLE;
9113 buf_barrier.offset = 0;
9114 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009115 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9116 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009117
9118 m_errorMonitor->VerifyFound();
9119}
9120
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009121TEST_F(VkLayerTest, InvalidBarriers) {
9122 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9123
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009125
Tony Barbour1fa09702017-03-16 12:09:08 -06009126 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009127 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009128 if (!depth_format) {
9129 printf(" No Depth + Stencil format found. Skipped.\n");
9130 return;
9131 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009132 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9133
9134 VkMemoryBarrier mem_barrier = {};
9135 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9136 mem_barrier.pNext = NULL;
9137 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9138 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009139 m_commandBuffer->BeginCommandBuffer();
9140 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009141 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009142 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009143 &mem_barrier, 0, nullptr, 0, nullptr);
9144 m_errorMonitor->VerifyFound();
9145
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009147 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009148 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 -06009149 ASSERT_TRUE(image.initialized());
9150 VkImageMemoryBarrier img_barrier = {};
9151 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9152 img_barrier.pNext = NULL;
9153 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9154 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9155 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9156 // New layout can't be UNDEFINED
9157 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9158 img_barrier.image = image.handle();
9159 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9160 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9161 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9162 img_barrier.subresourceRange.baseArrayLayer = 0;
9163 img_barrier.subresourceRange.baseMipLevel = 0;
9164 img_barrier.subresourceRange.layerCount = 1;
9165 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009166 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9167 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009168 m_errorMonitor->VerifyFound();
9169 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9170
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9172 "Subresource must have the sum of the "
9173 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009174 // baseArrayLayer + layerCount must be <= image's arrayLayers
9175 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009176 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9177 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009178 m_errorMonitor->VerifyFound();
9179 img_barrier.subresourceRange.baseArrayLayer = 0;
9180
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009182 // baseMipLevel + levelCount must be <= image's mipLevels
9183 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009184 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9185 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009186 m_errorMonitor->VerifyFound();
9187 img_barrier.subresourceRange.baseMipLevel = 0;
9188
Mike Weiblen7053aa32017-01-25 15:21:10 -07009189 // levelCount must be non-zero.
9190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9191 img_barrier.subresourceRange.levelCount = 0;
9192 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9193 nullptr, 0, nullptr, 1, &img_barrier);
9194 m_errorMonitor->VerifyFound();
9195 img_barrier.subresourceRange.levelCount = 1;
9196
9197 // layerCount must be non-zero.
9198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9199 img_barrier.subresourceRange.layerCount = 0;
9200 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9201 nullptr, 0, nullptr, 1, &img_barrier);
9202 m_errorMonitor->VerifyFound();
9203 img_barrier.subresourceRange.layerCount = 1;
9204
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009205 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 -06009206 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009207 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9208 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009209 VkBufferMemoryBarrier buf_barrier = {};
9210 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9211 buf_barrier.pNext = NULL;
9212 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9213 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9214 buf_barrier.buffer = buffer.handle();
9215 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9216 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9217 buf_barrier.offset = 0;
9218 buf_barrier.size = VK_WHOLE_SIZE;
9219 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009220 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9221 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009222 m_errorMonitor->VerifyFound();
9223 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9224
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009226 buf_barrier.offset = 257;
9227 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009228 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9229 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009230 m_errorMonitor->VerifyFound();
9231 buf_barrier.offset = 0;
9232
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009234 buf_barrier.size = 257;
9235 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009236 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9237 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009238 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009239
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009240 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009241 m_errorMonitor->SetDesiredFailureMsg(
9242 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009243 "Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009244 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009245 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009246 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009247 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9248 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009249 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009250
9251 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009252 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009253 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9254 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009255 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009256
9257 // Having anything other than DEPTH or STENCIL is an error
9258 m_errorMonitor->SetDesiredFailureMsg(
9259 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9260 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9261 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9262 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9263 nullptr, 0, nullptr, 1, &img_barrier);
9264 m_errorMonitor->VerifyFound();
9265
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009266 // Now test depth-only
9267 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009268 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9269 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009270 VkDepthStencilObj d_image(m_device);
9271 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9272 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009273 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009274 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009275 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009276
9277 // DEPTH bit must be set
9278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9279 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009280 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009281 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9282 0, nullptr, 0, nullptr, 1, &img_barrier);
9283 m_errorMonitor->VerifyFound();
9284
9285 // No bits other than DEPTH may be set
9286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9287 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9288 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009289 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9290 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009291 m_errorMonitor->VerifyFound();
9292 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009293
9294 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009295 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9296 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009297 VkDepthStencilObj s_image(m_device);
9298 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9299 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009300 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009301 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009302 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009303 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9305 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009306 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009307 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9308 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009309 m_errorMonitor->VerifyFound();
9310 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009311
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009312 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009313 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009314 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 -06009315 ASSERT_TRUE(c_image.initialized());
9316 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9317 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9318 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009319
9320 // COLOR bit must be set
9321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9322 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009323 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009324 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9325 nullptr, 0, nullptr, 1, &img_barrier);
9326 m_errorMonitor->VerifyFound();
9327
9328 // No bits other than COLOR may be set
9329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9330 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9331 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009332 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9333 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009334 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009335
Mike Weiblene6e01172017-03-07 22:18:40 -07009336 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9337 {
9338 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009339 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 -07009340 ASSERT_TRUE(img_color.initialized());
9341
9342 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009343 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 -07009344 ASSERT_TRUE(img_ds.initialized());
9345
9346 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009347 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 -07009348 ASSERT_TRUE(img_xfer_src.initialized());
9349
9350 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009351 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 -07009352 ASSERT_TRUE(img_xfer_dst.initialized());
9353
9354 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009355 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 -07009356 ASSERT_TRUE(img_sampled.initialized());
9357
9358 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009359 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 -07009360 ASSERT_TRUE(img_input.initialized());
9361
9362 const struct {
9363 VkImageObj &image_obj;
9364 VkImageLayout bad_layout;
9365 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9366 } bad_buffer_layouts[] = {
9367 // clang-format off
9368 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9369 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9370 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9371 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9372 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9373 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9374 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9375 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9376 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9377 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9378 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9379 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9380 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9381 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9382 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9383 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9384 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9385 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9386 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9387 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9388 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9389 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9390 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9391 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9392 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9393 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9394 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9395 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9396 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9397 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9398 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9399 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9400 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9401 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9402 // clang-format on
9403 };
9404 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9405
9406 for (uint32_t i = 0; i < layout_count; ++i) {
9407 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9408 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9409 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9410 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9411 : VK_IMAGE_ASPECT_COLOR_BIT;
9412
9413 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9414 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9416 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9417 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9418 m_errorMonitor->VerifyFound();
9419
9420 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9421 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9423 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9424 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9425 m_errorMonitor->VerifyFound();
9426 }
9427
9428 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9429 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9430 }
9431
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009432 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9433
9434 // Create command pool with incompatible queueflags
9435 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009436 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009437 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009438 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009439 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009440 }
9441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9442
9443 VkCommandPool command_pool;
9444 VkCommandPoolCreateInfo pool_create_info{};
9445 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9446 pool_create_info.queueFamilyIndex = queue_family_index;
9447 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9448 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9449
9450 // Allocate a command buffer
9451 VkCommandBuffer bad_command_buffer;
9452 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9453 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9454 command_buffer_allocate_info.commandPool = command_pool;
9455 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9456 command_buffer_allocate_info.commandBufferCount = 1;
9457 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9458
9459 VkCommandBufferBeginInfo cbbi = {};
9460 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9461 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9462 buf_barrier.offset = 0;
9463 buf_barrier.size = VK_WHOLE_SIZE;
9464 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9465 &buf_barrier, 0, nullptr);
9466 m_errorMonitor->VerifyFound();
9467
9468 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9469 vkEndCommandBuffer(bad_command_buffer);
9470 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009471 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009472 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009473 }
9474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9475 VkEvent event;
9476 VkEventCreateInfo event_create_info{};
9477 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9478 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9479 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9480 nullptr, 0, nullptr);
9481 m_errorMonitor->VerifyFound();
9482
9483 vkEndCommandBuffer(bad_command_buffer);
9484 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009485}
9486
Tony Barbour18ba25c2016-09-29 13:42:40 -06009487TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9488 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9489
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009491 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009492 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009493 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 -07009494 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009495 ASSERT_TRUE(image.initialized());
9496
9497 VkImageMemoryBarrier barrier = {};
9498 VkImageSubresourceRange range;
9499 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9500 barrier.srcAccessMask = 0;
9501 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9502 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9503 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9504 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9505 barrier.image = image.handle();
9506 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9507 range.baseMipLevel = 0;
9508 range.levelCount = 1;
9509 range.baseArrayLayer = 0;
9510 range.layerCount = 1;
9511 barrier.subresourceRange = range;
9512 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9513 cmdbuf.BeginCommandBuffer();
9514 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9515 &barrier);
9516 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9517 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9518 barrier.srcAccessMask = 0;
9519 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9520 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9521 &barrier);
9522
9523 m_errorMonitor->VerifyFound();
9524}
9525
Karl Schultz6addd812016-02-02 17:17:23 -07009526TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009527 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009528 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009530
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009531 uint32_t const indices[] = {0};
9532 VkBufferCreateInfo buf_info = {};
9533 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9534 buf_info.size = 1024;
9535 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9536 buf_info.queueFamilyIndexCount = 1;
9537 buf_info.pQueueFamilyIndices = indices;
9538
9539 VkBuffer buffer;
9540 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9541 ASSERT_VK_SUCCESS(err);
9542
9543 VkMemoryRequirements requirements;
9544 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9545
9546 VkMemoryAllocateInfo alloc_info{};
9547 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9548 alloc_info.pNext = NULL;
9549 alloc_info.memoryTypeIndex = 0;
9550 alloc_info.allocationSize = requirements.size;
9551 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9552 ASSERT_TRUE(pass);
9553
9554 VkDeviceMemory memory;
9555 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9556 ASSERT_VK_SUCCESS(err);
9557
9558 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009559 ASSERT_VK_SUCCESS(err);
9560
Tony Barbour552f6c02016-12-21 14:34:07 -07009561 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009562 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009563
Karl Schultz6addd812016-02-02 17:17:23 -07009564 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9565 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009566 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9568 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009569 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009570
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009571 vkFreeMemory(m_device->device(), memory, NULL);
9572 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009573}
9574
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009575TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9576 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009577 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9579 VkBufferCreateInfo buffCI = {};
9580 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9581 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009582 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009583 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009584 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009585 uint32_t qfi[2];
9586 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009587 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009588
9589 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009590 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009591
9592 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9594 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9595 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009596 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009597 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009598
9599 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009600 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9602
9603 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9604 buffCI.queueFamilyIndexCount = 2;
9605 qfi[0] = 1;
9606 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009607 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009608 VkDeviceMemory mem;
9609 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009610 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009611
9612 VkMemoryAllocateInfo alloc_info = {};
9613 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9614 alloc_info.allocationSize = 1024;
9615 bool pass = false;
9616 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9617 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009618 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009619 return;
9620 }
9621 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009622 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009623
9624 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009625 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009626 m_commandBuffer->end();
9627 QueueCommandBuffer(false);
9628 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009629 vkDestroyBuffer(m_device->device(), ib2, NULL);
9630 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009631 }
9632
Tony Barbourdf4c0042016-06-01 15:55:43 -06009633 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009634}
9635
Karl Schultz6addd812016-02-02 17:17:23 -07009636TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009637 TEST_DESCRIPTION(
9638 "Attempt vkCmdExecuteCommands with a primary command buffer"
9639 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009640
Tony Barbour1fa09702017-03-16 12:09:08 -06009641 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009642 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009643
Chris Forbesf29a84f2016-10-06 18:39:28 +13009644 // An empty primary command buffer
9645 VkCommandBufferObj cb(m_device, m_commandPool);
9646 cb.BeginCommandBuffer();
9647 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009648
Chris Forbesf29a84f2016-10-06 18:39:28 +13009649 m_commandBuffer->BeginCommandBuffer();
9650 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9651 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009652
Chris Forbesf29a84f2016-10-06 18:39:28 +13009653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9654 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009655 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009656
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -06009657 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009658}
9659
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009660TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009661 TEST_DESCRIPTION(
9662 "Attempt to update descriptor sets for images and buffers "
9663 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009664 VkResult err;
9665
Tony Barbour1fa09702017-03-16 12:09:08 -06009666 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009667 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9668 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9669 ds_type_count[i].type = VkDescriptorType(i);
9670 ds_type_count[i].descriptorCount = 1;
9671 }
9672 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9673 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9674 ds_pool_ci.pNext = NULL;
9675 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9676 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9677 ds_pool_ci.pPoolSizes = ds_type_count;
9678
9679 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009680 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009681 ASSERT_VK_SUCCESS(err);
9682
9683 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009684 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009685 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9686 dsl_binding[i].binding = 0;
9687 dsl_binding[i].descriptorType = VkDescriptorType(i);
9688 dsl_binding[i].descriptorCount = 1;
9689 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9690 dsl_binding[i].pImmutableSamplers = NULL;
9691 }
9692
9693 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9694 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9695 ds_layout_ci.pNext = NULL;
9696 ds_layout_ci.bindingCount = 1;
9697 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9698 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9699 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009700 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009701 ASSERT_VK_SUCCESS(err);
9702 }
9703 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9704 VkDescriptorSetAllocateInfo alloc_info = {};
9705 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9706 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9707 alloc_info.descriptorPool = ds_pool;
9708 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009709 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009710 ASSERT_VK_SUCCESS(err);
9711
9712 // Create a buffer & bufferView to be used for invalid updates
9713 VkBufferCreateInfo buff_ci = {};
9714 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009715 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009716 buff_ci.size = 256;
9717 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009718 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009719 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9720 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009721
9722 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9723 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9724 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9725 ASSERT_VK_SUCCESS(err);
9726
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009727 VkMemoryRequirements mem_reqs;
9728 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9729 VkMemoryAllocateInfo mem_alloc_info = {};
9730 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9731 mem_alloc_info.pNext = NULL;
9732 mem_alloc_info.memoryTypeIndex = 0;
9733 mem_alloc_info.allocationSize = mem_reqs.size;
9734 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9735 if (!pass) {
9736 vkDestroyBuffer(m_device->device(), buffer, NULL);
9737 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9738 return;
9739 }
9740 VkDeviceMemory mem;
9741 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9742 ASSERT_VK_SUCCESS(err);
9743 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9744 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009745
9746 VkBufferViewCreateInfo buff_view_ci = {};
9747 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9748 buff_view_ci.buffer = buffer;
9749 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9750 buff_view_ci.range = VK_WHOLE_SIZE;
9751 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009752 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009753 ASSERT_VK_SUCCESS(err);
9754
Tony Barbour415497c2017-01-24 10:06:09 -07009755 // Now get resources / view for storage_texel_buffer
9756 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9757 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9758 if (!pass) {
9759 vkDestroyBuffer(m_device->device(), buffer, NULL);
9760 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9761 vkFreeMemory(m_device->device(), mem, NULL);
9762 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9763 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9764 return;
9765 }
9766 VkDeviceMemory storage_texel_buffer_mem;
9767 VkBufferView storage_texel_buffer_view;
9768 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9769 ASSERT_VK_SUCCESS(err);
9770 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9771 ASSERT_VK_SUCCESS(err);
9772 buff_view_ci.buffer = storage_texel_buffer;
9773 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9774 ASSERT_VK_SUCCESS(err);
9775
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009776 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009777 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009778 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009779 image_ci.format = VK_FORMAT_UNDEFINED;
9780 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9781 VkFormat format = static_cast<VkFormat>(f);
9782 VkFormatProperties fProps = m_device->format_properties(format);
9783 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9784 image_ci.format = format;
9785 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9786 break;
9787 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9788 image_ci.format = format;
9789 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9790 break;
9791 }
9792 }
9793 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9794 return;
9795 }
9796
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009797 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9798 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009799 image_ci.extent.width = 64;
9800 image_ci.extent.height = 64;
9801 image_ci.extent.depth = 1;
9802 image_ci.mipLevels = 1;
9803 image_ci.arrayLayers = 1;
9804 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009805 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009806 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009807 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9808 VkImage image;
9809 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9810 ASSERT_VK_SUCCESS(err);
9811 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009812 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009813
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009814 VkMemoryAllocateInfo mem_alloc = {};
9815 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9816 mem_alloc.pNext = NULL;
9817 mem_alloc.allocationSize = 0;
9818 mem_alloc.memoryTypeIndex = 0;
9819 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9820 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009821 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009822 ASSERT_TRUE(pass);
9823 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9824 ASSERT_VK_SUCCESS(err);
9825 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9826 ASSERT_VK_SUCCESS(err);
9827 // Now create view for image
9828 VkImageViewCreateInfo image_view_ci = {};
9829 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9830 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009831 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009832 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9833 image_view_ci.subresourceRange.layerCount = 1;
9834 image_view_ci.subresourceRange.baseArrayLayer = 0;
9835 image_view_ci.subresourceRange.levelCount = 1;
9836 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9837 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009838 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009839 ASSERT_VK_SUCCESS(err);
9840
9841 VkDescriptorBufferInfo buff_info = {};
9842 buff_info.buffer = buffer;
9843 VkDescriptorImageInfo img_info = {};
9844 img_info.imageView = image_view;
9845 VkWriteDescriptorSet descriptor_write = {};
9846 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9847 descriptor_write.dstBinding = 0;
9848 descriptor_write.descriptorCount = 1;
9849 descriptor_write.pTexelBufferView = &buff_view;
9850 descriptor_write.pBufferInfo = &buff_info;
9851 descriptor_write.pImageInfo = &img_info;
9852
9853 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009854 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009855 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9856 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9857 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9858 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9859 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9860 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9861 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9862 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9863 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9864 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9865 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009866 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009867 // Start loop at 1 as SAMPLER desc type has no usage bit error
9868 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009869 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9870 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9871 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9872 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009873 descriptor_write.descriptorType = VkDescriptorType(i);
9874 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009876
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009877 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009878
9879 m_errorMonitor->VerifyFound();
9880 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009881 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9882 descriptor_write.pTexelBufferView = &buff_view;
9883 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009884 }
Tony Barbour415497c2017-01-24 10:06:09 -07009885
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009886 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9887 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009888 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009889 vkDestroyImageView(m_device->device(), image_view, NULL);
9890 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009891 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009892 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009893 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009894 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009895 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009896 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9897}
9898
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009899TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009900 TEST_DESCRIPTION(
9901 "Attempt to update buffer descriptor set that has incorrect "
9902 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009903 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009904 "2. range value of 0\n"
9905 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009906 VkResult err;
9907
Tony Barbour1fa09702017-03-16 12:09:08 -06009908 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009909 VkDescriptorPoolSize ds_type_count = {};
9910 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9911 ds_type_count.descriptorCount = 1;
9912
9913 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9914 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9915 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009916 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009917 ds_pool_ci.maxSets = 1;
9918 ds_pool_ci.poolSizeCount = 1;
9919 ds_pool_ci.pPoolSizes = &ds_type_count;
9920
9921 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009922 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009923 ASSERT_VK_SUCCESS(err);
9924
9925 // Create layout with single uniform buffer descriptor
9926 VkDescriptorSetLayoutBinding dsl_binding = {};
9927 dsl_binding.binding = 0;
9928 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9929 dsl_binding.descriptorCount = 1;
9930 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9931 dsl_binding.pImmutableSamplers = NULL;
9932
9933 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9934 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9935 ds_layout_ci.pNext = NULL;
9936 ds_layout_ci.bindingCount = 1;
9937 ds_layout_ci.pBindings = &dsl_binding;
9938 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009939 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009940 ASSERT_VK_SUCCESS(err);
9941
9942 VkDescriptorSet descriptor_set = {};
9943 VkDescriptorSetAllocateInfo alloc_info = {};
9944 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9945 alloc_info.descriptorSetCount = 1;
9946 alloc_info.descriptorPool = ds_pool;
9947 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009948 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009949 ASSERT_VK_SUCCESS(err);
9950
9951 // Create a buffer to be used for invalid updates
9952 VkBufferCreateInfo buff_ci = {};
9953 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9954 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009955 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009956 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9957 VkBuffer buffer;
9958 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9959 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009960
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009961 // Have to bind memory to buffer before descriptor update
9962 VkMemoryAllocateInfo mem_alloc = {};
9963 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9964 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009965 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009966 mem_alloc.memoryTypeIndex = 0;
9967
9968 VkMemoryRequirements mem_reqs;
9969 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009970 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009971 if (!pass) {
9972 vkDestroyBuffer(m_device->device(), buffer, NULL);
9973 return;
9974 }
9975
9976 VkDeviceMemory mem;
9977 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9978 ASSERT_VK_SUCCESS(err);
9979 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9980 ASSERT_VK_SUCCESS(err);
9981
9982 VkDescriptorBufferInfo buff_info = {};
9983 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009984 // Cause error due to offset out of range
9985 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009986 buff_info.range = VK_WHOLE_SIZE;
9987 VkWriteDescriptorSet descriptor_write = {};
9988 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9989 descriptor_write.dstBinding = 0;
9990 descriptor_write.descriptorCount = 1;
9991 descriptor_write.pTexelBufferView = nullptr;
9992 descriptor_write.pBufferInfo = &buff_info;
9993 descriptor_write.pImageInfo = nullptr;
9994
9995 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9996 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009998
9999 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10000
10001 m_errorMonitor->VerifyFound();
10002 // Now cause error due to range of 0
10003 buff_info.offset = 0;
10004 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010006
10007 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10008
10009 m_errorMonitor->VerifyFound();
10010 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010011 buff_info.offset = 0;
10012 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010014
10015 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10016
10017 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010018 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010019 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10020 vkDestroyBuffer(m_device->device(), buffer, NULL);
10021 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10022 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10023}
10024
Tobin Ehlis845887e2017-02-02 19:01:44 -070010025TEST_F(VkLayerTest, DSBufferLimitErrors) {
10026 TEST_DESCRIPTION(
10027 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10028 "Test cases include:\n"
10029 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10030 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10031 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10032 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10033 VkResult err;
10034
Tony Barbour1fa09702017-03-16 12:09:08 -060010035 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010036 VkDescriptorPoolSize ds_type_count[2] = {};
10037 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10038 ds_type_count[0].descriptorCount = 1;
10039 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10040 ds_type_count[1].descriptorCount = 1;
10041
10042 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10043 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10044 ds_pool_ci.pNext = NULL;
10045 ds_pool_ci.maxSets = 1;
10046 ds_pool_ci.poolSizeCount = 2;
10047 ds_pool_ci.pPoolSizes = ds_type_count;
10048
10049 VkDescriptorPool ds_pool;
10050 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10051 ASSERT_VK_SUCCESS(err);
10052
10053 // Create layout with single uniform buffer & single storage buffer descriptor
10054 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10055 dsl_binding[0].binding = 0;
10056 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10057 dsl_binding[0].descriptorCount = 1;
10058 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10059 dsl_binding[0].pImmutableSamplers = NULL;
10060 dsl_binding[1].binding = 1;
10061 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10062 dsl_binding[1].descriptorCount = 1;
10063 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10064 dsl_binding[1].pImmutableSamplers = NULL;
10065
10066 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10067 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10068 ds_layout_ci.pNext = NULL;
10069 ds_layout_ci.bindingCount = 2;
10070 ds_layout_ci.pBindings = dsl_binding;
10071 VkDescriptorSetLayout ds_layout;
10072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10073 ASSERT_VK_SUCCESS(err);
10074
10075 VkDescriptorSet descriptor_set = {};
10076 VkDescriptorSetAllocateInfo alloc_info = {};
10077 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10078 alloc_info.descriptorSetCount = 1;
10079 alloc_info.descriptorPool = ds_pool;
10080 alloc_info.pSetLayouts = &ds_layout;
10081 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10082 ASSERT_VK_SUCCESS(err);
10083
10084 // Create a buffer to be used for invalid updates
10085 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10086 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10087 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10088 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10089 VkBufferCreateInfo ub_ci = {};
10090 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10091 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10092 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10093 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10094 VkBuffer uniform_buffer;
10095 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10096 ASSERT_VK_SUCCESS(err);
10097 VkBufferCreateInfo sb_ci = {};
10098 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10099 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10100 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10101 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10102 VkBuffer storage_buffer;
10103 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10104 ASSERT_VK_SUCCESS(err);
10105 // Have to bind memory to buffer before descriptor update
10106 VkMemoryAllocateInfo mem_alloc = {};
10107 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10108 mem_alloc.pNext = NULL;
10109 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10110 mem_alloc.memoryTypeIndex = 0;
10111
Cort Stratton77a0d592017-02-17 13:14:13 -080010112 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10113 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10114 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10115 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10116 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010117 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010118 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010119 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010120 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10121 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010122 return;
10123 }
10124
10125 VkDeviceMemory mem;
10126 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010127 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010128 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010129 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10130 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10131 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10132 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10133 return;
10134 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010135 ASSERT_VK_SUCCESS(err);
10136 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10137 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010138 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010139 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10140 ASSERT_VK_SUCCESS(err);
10141
10142 VkDescriptorBufferInfo buff_info = {};
10143 buff_info.buffer = uniform_buffer;
10144 buff_info.range = ub_ci.size; // This will exceed limit
10145 VkWriteDescriptorSet descriptor_write = {};
10146 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10147 descriptor_write.dstBinding = 0;
10148 descriptor_write.descriptorCount = 1;
10149 descriptor_write.pTexelBufferView = nullptr;
10150 descriptor_write.pBufferInfo = &buff_info;
10151 descriptor_write.pImageInfo = nullptr;
10152
10153 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10154 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010155 if (max_ub_range != UINT32_MAX) {
10156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10157 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10158 m_errorMonitor->VerifyFound();
10159 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010160 // Reduce size of range to acceptable limit & cause offset error
10161 buff_info.range = max_ub_range;
10162 buff_info.offset = min_ub_align - 1;
10163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10164 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10165 m_errorMonitor->VerifyFound();
10166
10167 // Now break storage updates
10168 buff_info.buffer = storage_buffer;
10169 buff_info.range = sb_ci.size; // This will exceed limit
10170 buff_info.offset = 0; // Reset offset for this update
10171
10172 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10173 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010174 if (max_ub_range != UINT32_MAX) {
10175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10176 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10177 m_errorMonitor->VerifyFound();
10178 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010179
10180 // Reduce size of range to acceptable limit & cause offset error
10181 buff_info.range = max_sb_range;
10182 buff_info.offset = min_sb_align - 1;
10183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10184 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10185 m_errorMonitor->VerifyFound();
10186
10187 vkFreeMemory(m_device->device(), mem, NULL);
10188 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10189 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10190 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10191 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10192}
10193
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010194TEST_F(VkLayerTest, DSAspectBitsErrors) {
10195 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10196 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010197 TEST_DESCRIPTION(
10198 "Attempt to update descriptor sets for images "
10199 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010200 VkResult err;
10201
Tony Barbour1fa09702017-03-16 12:09:08 -060010202 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010203 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010204 if (!depth_format) {
10205 printf(" No Depth + Stencil format found. Skipped.\n");
10206 return;
10207 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010208 VkDescriptorPoolSize ds_type_count = {};
10209 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10210 ds_type_count.descriptorCount = 1;
10211
10212 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10213 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10214 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010215 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010216 ds_pool_ci.maxSets = 5;
10217 ds_pool_ci.poolSizeCount = 1;
10218 ds_pool_ci.pPoolSizes = &ds_type_count;
10219
10220 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010221 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010222 ASSERT_VK_SUCCESS(err);
10223
10224 VkDescriptorSetLayoutBinding dsl_binding = {};
10225 dsl_binding.binding = 0;
10226 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10227 dsl_binding.descriptorCount = 1;
10228 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10229 dsl_binding.pImmutableSamplers = NULL;
10230
10231 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10232 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10233 ds_layout_ci.pNext = NULL;
10234 ds_layout_ci.bindingCount = 1;
10235 ds_layout_ci.pBindings = &dsl_binding;
10236 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010237 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010238 ASSERT_VK_SUCCESS(err);
10239
10240 VkDescriptorSet descriptor_set = {};
10241 VkDescriptorSetAllocateInfo alloc_info = {};
10242 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10243 alloc_info.descriptorSetCount = 1;
10244 alloc_info.descriptorPool = ds_pool;
10245 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010246 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010247 ASSERT_VK_SUCCESS(err);
10248
10249 // Create an image to be used for invalid updates
10250 VkImageCreateInfo image_ci = {};
10251 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10252 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010253 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010254 image_ci.extent.width = 64;
10255 image_ci.extent.height = 64;
10256 image_ci.extent.depth = 1;
10257 image_ci.mipLevels = 1;
10258 image_ci.arrayLayers = 1;
10259 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010260 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010261 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10262 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10263 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10264 VkImage image;
10265 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10266 ASSERT_VK_SUCCESS(err);
10267 // Bind memory to image
10268 VkMemoryRequirements mem_reqs;
10269 VkDeviceMemory image_mem;
10270 bool pass;
10271 VkMemoryAllocateInfo mem_alloc = {};
10272 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10273 mem_alloc.pNext = NULL;
10274 mem_alloc.allocationSize = 0;
10275 mem_alloc.memoryTypeIndex = 0;
10276 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10277 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010278 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010279 ASSERT_TRUE(pass);
10280 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10281 ASSERT_VK_SUCCESS(err);
10282 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10283 ASSERT_VK_SUCCESS(err);
10284 // Now create view for image
10285 VkImageViewCreateInfo image_view_ci = {};
10286 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10287 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010288 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010289 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10290 image_view_ci.subresourceRange.layerCount = 1;
10291 image_view_ci.subresourceRange.baseArrayLayer = 0;
10292 image_view_ci.subresourceRange.levelCount = 1;
10293 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010294 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010295
10296 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010297 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010298 ASSERT_VK_SUCCESS(err);
10299
10300 VkDescriptorImageInfo img_info = {};
10301 img_info.imageView = image_view;
10302 VkWriteDescriptorSet descriptor_write = {};
10303 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10304 descriptor_write.dstBinding = 0;
10305 descriptor_write.descriptorCount = 1;
10306 descriptor_write.pTexelBufferView = NULL;
10307 descriptor_write.pBufferInfo = NULL;
10308 descriptor_write.pImageInfo = &img_info;
10309 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10310 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010311 const char *error_msg =
10312 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10313 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010315
10316 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10317
10318 m_errorMonitor->VerifyFound();
10319 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10320 vkDestroyImage(m_device->device(), image, NULL);
10321 vkFreeMemory(m_device->device(), image_mem, NULL);
10322 vkDestroyImageView(m_device->device(), image_view, NULL);
10323 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10324 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10325}
10326
Karl Schultz6addd812016-02-02 17:17:23 -070010327TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010328 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010329 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010330
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10332 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10333 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010334
Tony Barbour1fa09702017-03-16 12:09:08 -060010335 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010336 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010337 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010338 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10339 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010340
10341 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010342 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10343 ds_pool_ci.pNext = NULL;
10344 ds_pool_ci.maxSets = 1;
10345 ds_pool_ci.poolSizeCount = 1;
10346 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010347
Tobin Ehlis3b780662015-05-28 12:11:26 -060010348 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010349 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010350 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010351 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010352 dsl_binding.binding = 0;
10353 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10354 dsl_binding.descriptorCount = 1;
10355 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10356 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010357
Tony Barboureb254902015-07-15 12:50:33 -060010358 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010359 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10360 ds_layout_ci.pNext = NULL;
10361 ds_layout_ci.bindingCount = 1;
10362 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010363
Tobin Ehlis3b780662015-05-28 12:11:26 -060010364 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010365 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010366 ASSERT_VK_SUCCESS(err);
10367
10368 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010369 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010370 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010371 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010372 alloc_info.descriptorPool = ds_pool;
10373 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010374 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010375 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010376
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010377 VkSamplerCreateInfo sampler_ci = {};
10378 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10379 sampler_ci.pNext = NULL;
10380 sampler_ci.magFilter = VK_FILTER_NEAREST;
10381 sampler_ci.minFilter = VK_FILTER_NEAREST;
10382 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10383 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10384 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10385 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10386 sampler_ci.mipLodBias = 1.0;
10387 sampler_ci.anisotropyEnable = VK_FALSE;
10388 sampler_ci.maxAnisotropy = 1;
10389 sampler_ci.compareEnable = VK_FALSE;
10390 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10391 sampler_ci.minLod = 1.0;
10392 sampler_ci.maxLod = 1.0;
10393 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10394 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10395 VkSampler sampler;
10396 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10397 ASSERT_VK_SUCCESS(err);
10398
10399 VkDescriptorImageInfo info = {};
10400 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010401
10402 VkWriteDescriptorSet descriptor_write;
10403 memset(&descriptor_write, 0, sizeof(descriptor_write));
10404 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010405 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010406 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010407 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010408 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010409 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010410
10411 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10412
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010413 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010414
Chia-I Wuf7458c52015-10-26 21:10:41 +080010415 vkDestroySampler(m_device->device(), sampler, NULL);
10416 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10417 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010418}
10419
Karl Schultz6addd812016-02-02 17:17:23 -070010420TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010421 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010422 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010423
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010425
Tony Barbour1fa09702017-03-16 12:09:08 -060010426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010427 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010428 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010429 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10430 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010431
10432 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010433 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10434 ds_pool_ci.pNext = NULL;
10435 ds_pool_ci.maxSets = 1;
10436 ds_pool_ci.poolSizeCount = 1;
10437 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010438
Tobin Ehlis3b780662015-05-28 12:11:26 -060010439 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010440 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010441 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010442
Tony Barboureb254902015-07-15 12:50:33 -060010443 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010444 dsl_binding.binding = 0;
10445 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10446 dsl_binding.descriptorCount = 1;
10447 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10448 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010449
10450 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010451 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10452 ds_layout_ci.pNext = NULL;
10453 ds_layout_ci.bindingCount = 1;
10454 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010455
Tobin Ehlis3b780662015-05-28 12:11:26 -060010456 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010457 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010458 ASSERT_VK_SUCCESS(err);
10459
10460 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010461 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010462 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010463 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010464 alloc_info.descriptorPool = ds_pool;
10465 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010466 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010467 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010468
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010469 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10470
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010471 // Correctly update descriptor to avoid "NOT_UPDATED" error
10472 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010473 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010474 buff_info.offset = 0;
10475 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010476
10477 VkWriteDescriptorSet descriptor_write;
10478 memset(&descriptor_write, 0, sizeof(descriptor_write));
10479 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010480 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010481 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010482 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010483 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10484 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010485
10486 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10487
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010488 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010489
Chia-I Wuf7458c52015-10-26 21:10:41 +080010490 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10491 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010492}
10493
Karl Schultz6addd812016-02-02 17:17:23 -070010494TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010495 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010496 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010497
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010499
Tony Barbour1fa09702017-03-16 12:09:08 -060010500 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010501 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010502 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010503 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10504 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010505
10506 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010507 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10508 ds_pool_ci.pNext = NULL;
10509 ds_pool_ci.maxSets = 1;
10510 ds_pool_ci.poolSizeCount = 1;
10511 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010512
Tobin Ehlis3b780662015-05-28 12:11:26 -060010513 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010514 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010515 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010516
Tony Barboureb254902015-07-15 12:50:33 -060010517 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010518 dsl_binding.binding = 0;
10519 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10520 dsl_binding.descriptorCount = 1;
10521 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10522 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010523
10524 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010525 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10526 ds_layout_ci.pNext = NULL;
10527 ds_layout_ci.bindingCount = 1;
10528 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010529 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010530 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010531 ASSERT_VK_SUCCESS(err);
10532
10533 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010534 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010535 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010536 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010537 alloc_info.descriptorPool = ds_pool;
10538 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010539 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010540 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010541
Tony Barboureb254902015-07-15 12:50:33 -060010542 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010543 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10544 sampler_ci.pNext = NULL;
10545 sampler_ci.magFilter = VK_FILTER_NEAREST;
10546 sampler_ci.minFilter = VK_FILTER_NEAREST;
10547 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10548 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10549 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10550 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10551 sampler_ci.mipLodBias = 1.0;
10552 sampler_ci.anisotropyEnable = VK_FALSE;
10553 sampler_ci.maxAnisotropy = 1;
10554 sampler_ci.compareEnable = VK_FALSE;
10555 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10556 sampler_ci.minLod = 1.0;
10557 sampler_ci.maxLod = 1.0;
10558 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10559 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010560
Tobin Ehlis3b780662015-05-28 12:11:26 -060010561 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010562 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010563 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010564
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010565 VkDescriptorImageInfo info = {};
10566 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010567
10568 VkWriteDescriptorSet descriptor_write;
10569 memset(&descriptor_write, 0, sizeof(descriptor_write));
10570 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010571 descriptor_write.dstSet = descriptorSet;
10572 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010573 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010574 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010575 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010576 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010577
10578 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10579
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010580 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010581
Chia-I Wuf7458c52015-10-26 21:10:41 +080010582 vkDestroySampler(m_device->device(), sampler, NULL);
10583 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10584 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010585}
10586
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010587TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10588 // Create layout w/ empty binding and attempt to update it
10589 VkResult err;
10590
Tony Barbour1fa09702017-03-16 12:09:08 -060010591 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010592
10593 VkDescriptorPoolSize ds_type_count = {};
10594 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10595 ds_type_count.descriptorCount = 1;
10596
10597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10599 ds_pool_ci.pNext = NULL;
10600 ds_pool_ci.maxSets = 1;
10601 ds_pool_ci.poolSizeCount = 1;
10602 ds_pool_ci.pPoolSizes = &ds_type_count;
10603
10604 VkDescriptorPool ds_pool;
10605 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10606 ASSERT_VK_SUCCESS(err);
10607
10608 VkDescriptorSetLayoutBinding dsl_binding = {};
10609 dsl_binding.binding = 0;
10610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10611 dsl_binding.descriptorCount = 0;
10612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10613 dsl_binding.pImmutableSamplers = NULL;
10614
10615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10617 ds_layout_ci.pNext = NULL;
10618 ds_layout_ci.bindingCount = 1;
10619 ds_layout_ci.pBindings = &dsl_binding;
10620 VkDescriptorSetLayout ds_layout;
10621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10622 ASSERT_VK_SUCCESS(err);
10623
10624 VkDescriptorSet descriptor_set;
10625 VkDescriptorSetAllocateInfo alloc_info = {};
10626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10627 alloc_info.descriptorSetCount = 1;
10628 alloc_info.descriptorPool = ds_pool;
10629 alloc_info.pSetLayouts = &ds_layout;
10630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10631 ASSERT_VK_SUCCESS(err);
10632
10633 VkSamplerCreateInfo sampler_ci = {};
10634 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10635 sampler_ci.magFilter = VK_FILTER_NEAREST;
10636 sampler_ci.minFilter = VK_FILTER_NEAREST;
10637 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10638 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10639 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10640 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10641 sampler_ci.mipLodBias = 1.0;
10642 sampler_ci.maxAnisotropy = 1;
10643 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10644 sampler_ci.minLod = 1.0;
10645 sampler_ci.maxLod = 1.0;
10646 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10647
10648 VkSampler sampler;
10649 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10650 ASSERT_VK_SUCCESS(err);
10651
10652 VkDescriptorImageInfo info = {};
10653 info.sampler = sampler;
10654
10655 VkWriteDescriptorSet descriptor_write;
10656 memset(&descriptor_write, 0, sizeof(descriptor_write));
10657 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10658 descriptor_write.dstSet = descriptor_set;
10659 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010660 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010661 // This is the wrong type, but empty binding error will be flagged first
10662 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10663 descriptor_write.pImageInfo = &info;
10664
10665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10666 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10667 m_errorMonitor->VerifyFound();
10668
10669 vkDestroySampler(m_device->device(), sampler, NULL);
10670 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10671 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10672}
10673
Karl Schultz6addd812016-02-02 17:17:23 -070010674TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10675 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10676 // types
10677 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010678
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010679 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 -060010680
Tony Barbour1fa09702017-03-16 12:09:08 -060010681 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010682
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010683 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010684 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10685 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010686
10687 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010688 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10689 ds_pool_ci.pNext = NULL;
10690 ds_pool_ci.maxSets = 1;
10691 ds_pool_ci.poolSizeCount = 1;
10692 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010693
Tobin Ehlis3b780662015-05-28 12:11:26 -060010694 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010695 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010696 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010697 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010698 dsl_binding.binding = 0;
10699 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10700 dsl_binding.descriptorCount = 1;
10701 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10702 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010703
Tony Barboureb254902015-07-15 12:50:33 -060010704 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010705 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10706 ds_layout_ci.pNext = NULL;
10707 ds_layout_ci.bindingCount = 1;
10708 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010709
Tobin Ehlis3b780662015-05-28 12:11:26 -060010710 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010711 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010712 ASSERT_VK_SUCCESS(err);
10713
10714 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010715 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010716 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010717 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010718 alloc_info.descriptorPool = ds_pool;
10719 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010720 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010721 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010722
Tony Barboureb254902015-07-15 12:50:33 -060010723 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010724 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10725 sampler_ci.pNext = NULL;
10726 sampler_ci.magFilter = VK_FILTER_NEAREST;
10727 sampler_ci.minFilter = VK_FILTER_NEAREST;
10728 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10729 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10730 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10731 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10732 sampler_ci.mipLodBias = 1.0;
10733 sampler_ci.anisotropyEnable = VK_FALSE;
10734 sampler_ci.maxAnisotropy = 1;
10735 sampler_ci.compareEnable = VK_FALSE;
10736 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10737 sampler_ci.minLod = 1.0;
10738 sampler_ci.maxLod = 1.0;
10739 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10740 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010741 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010742 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010743 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010744
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010745 VkDescriptorImageInfo info = {};
10746 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010747
10748 VkWriteDescriptorSet descriptor_write;
10749 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010750 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010751 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010752 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010753 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010754 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010755 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010756
10757 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10758
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010759 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010760
Chia-I Wuf7458c52015-10-26 21:10:41 +080010761 vkDestroySampler(m_device->device(), sampler, NULL);
10762 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10763 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010764}
10765
Karl Schultz6addd812016-02-02 17:17:23 -070010766TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010767 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010768 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010769
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010771
Tony Barbour1fa09702017-03-16 12:09:08 -060010772 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010773 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10774 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010775 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010776 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10777 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010778
10779 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010780 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10781 ds_pool_ci.pNext = NULL;
10782 ds_pool_ci.maxSets = 1;
10783 ds_pool_ci.poolSizeCount = 1;
10784 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010785
10786 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010787 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010788 ASSERT_VK_SUCCESS(err);
10789
10790 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010791 dsl_binding.binding = 0;
10792 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10793 dsl_binding.descriptorCount = 1;
10794 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10795 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010796
10797 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010798 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10799 ds_layout_ci.pNext = NULL;
10800 ds_layout_ci.bindingCount = 1;
10801 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010802 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010803 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010804 ASSERT_VK_SUCCESS(err);
10805
10806 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010807 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010808 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010809 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010810 alloc_info.descriptorPool = ds_pool;
10811 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010812 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010813 ASSERT_VK_SUCCESS(err);
10814
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010815 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010816
10817 VkDescriptorImageInfo descriptor_info;
10818 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10819 descriptor_info.sampler = sampler;
10820
10821 VkWriteDescriptorSet descriptor_write;
10822 memset(&descriptor_write, 0, sizeof(descriptor_write));
10823 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010824 descriptor_write.dstSet = descriptorSet;
10825 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010826 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010827 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10828 descriptor_write.pImageInfo = &descriptor_info;
10829
10830 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10831
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010832 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010833
Chia-I Wuf7458c52015-10-26 21:10:41 +080010834 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10835 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010836}
10837
Karl Schultz6addd812016-02-02 17:17:23 -070010838TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10839 // Create a single combined Image/Sampler descriptor and send it an invalid
10840 // imageView
10841 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010842
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010844
Tony Barbour1fa09702017-03-16 12:09:08 -060010845 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010846 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010847 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10848 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010849
10850 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010851 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10852 ds_pool_ci.pNext = NULL;
10853 ds_pool_ci.maxSets = 1;
10854 ds_pool_ci.poolSizeCount = 1;
10855 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010856
10857 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010858 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010859 ASSERT_VK_SUCCESS(err);
10860
10861 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010862 dsl_binding.binding = 0;
10863 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10864 dsl_binding.descriptorCount = 1;
10865 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10866 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010867
10868 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010869 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10870 ds_layout_ci.pNext = NULL;
10871 ds_layout_ci.bindingCount = 1;
10872 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010873 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010874 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010875 ASSERT_VK_SUCCESS(err);
10876
10877 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010878 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010879 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010880 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010881 alloc_info.descriptorPool = ds_pool;
10882 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010883 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010884 ASSERT_VK_SUCCESS(err);
10885
10886 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010887 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10888 sampler_ci.pNext = NULL;
10889 sampler_ci.magFilter = VK_FILTER_NEAREST;
10890 sampler_ci.minFilter = VK_FILTER_NEAREST;
10891 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10892 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10893 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10894 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10895 sampler_ci.mipLodBias = 1.0;
10896 sampler_ci.anisotropyEnable = VK_FALSE;
10897 sampler_ci.maxAnisotropy = 1;
10898 sampler_ci.compareEnable = VK_FALSE;
10899 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10900 sampler_ci.minLod = 1.0;
10901 sampler_ci.maxLod = 1.0;
10902 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10903 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010904
10905 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010906 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010907 ASSERT_VK_SUCCESS(err);
10908
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010909 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010910
10911 VkDescriptorImageInfo descriptor_info;
10912 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10913 descriptor_info.sampler = sampler;
10914 descriptor_info.imageView = view;
10915
10916 VkWriteDescriptorSet descriptor_write;
10917 memset(&descriptor_write, 0, sizeof(descriptor_write));
10918 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010919 descriptor_write.dstSet = descriptorSet;
10920 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010921 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010922 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10923 descriptor_write.pImageInfo = &descriptor_info;
10924
10925 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10926
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010927 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010928
Chia-I Wuf7458c52015-10-26 21:10:41 +080010929 vkDestroySampler(m_device->device(), sampler, NULL);
10930 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10931 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010932}
10933
Karl Schultz6addd812016-02-02 17:17:23 -070010934TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10935 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10936 // into the other
10937 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010938
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10940 " binding #1 with type "
10941 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10942 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010943
Tony Barbour1fa09702017-03-16 12:09:08 -060010944 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010945 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010946 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010947 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10948 ds_type_count[0].descriptorCount = 1;
10949 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10950 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010951
10952 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010953 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10954 ds_pool_ci.pNext = NULL;
10955 ds_pool_ci.maxSets = 1;
10956 ds_pool_ci.poolSizeCount = 2;
10957 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010958
10959 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010960 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010961 ASSERT_VK_SUCCESS(err);
10962 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010963 dsl_binding[0].binding = 0;
10964 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10965 dsl_binding[0].descriptorCount = 1;
10966 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10967 dsl_binding[0].pImmutableSamplers = NULL;
10968 dsl_binding[1].binding = 1;
10969 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10970 dsl_binding[1].descriptorCount = 1;
10971 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10972 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010973
10974 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010975 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10976 ds_layout_ci.pNext = NULL;
10977 ds_layout_ci.bindingCount = 2;
10978 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010979
10980 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010981 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010982 ASSERT_VK_SUCCESS(err);
10983
10984 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010985 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010986 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010987 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010988 alloc_info.descriptorPool = ds_pool;
10989 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010990 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010991 ASSERT_VK_SUCCESS(err);
10992
10993 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010994 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10995 sampler_ci.pNext = NULL;
10996 sampler_ci.magFilter = VK_FILTER_NEAREST;
10997 sampler_ci.minFilter = VK_FILTER_NEAREST;
10998 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10999 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11000 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11001 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11002 sampler_ci.mipLodBias = 1.0;
11003 sampler_ci.anisotropyEnable = VK_FALSE;
11004 sampler_ci.maxAnisotropy = 1;
11005 sampler_ci.compareEnable = VK_FALSE;
11006 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11007 sampler_ci.minLod = 1.0;
11008 sampler_ci.maxLod = 1.0;
11009 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11010 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011011
11012 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011013 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011014 ASSERT_VK_SUCCESS(err);
11015
11016 VkDescriptorImageInfo info = {};
11017 info.sampler = sampler;
11018
11019 VkWriteDescriptorSet descriptor_write;
11020 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11021 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011022 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011023 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011024 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011025 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11026 descriptor_write.pImageInfo = &info;
11027 // This write update should succeed
11028 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11029 // Now perform a copy update that fails due to type mismatch
11030 VkCopyDescriptorSet copy_ds_update;
11031 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11032 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11033 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011034 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011035 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011036 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11037 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011038 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11039
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011040 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011041 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011042 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 -060011043 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11044 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11045 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011046 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011047 copy_ds_update.dstSet = descriptorSet;
11048 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011049 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011050 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11051
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011052 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011053
Tobin Ehlis04356f92015-10-27 16:35:27 -060011054 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11056 " binding#1 with offset index of 1 plus "
11057 "update array offset of 0 and update of "
11058 "5 descriptors oversteps total number "
11059 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011060
Tobin Ehlis04356f92015-10-27 16:35:27 -060011061 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11062 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11063 copy_ds_update.srcSet = descriptorSet;
11064 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011065 copy_ds_update.dstSet = descriptorSet;
11066 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011067 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011068 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11069
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011070 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011071
Chia-I Wuf7458c52015-10-26 21:10:41 +080011072 vkDestroySampler(m_device->device(), sampler, NULL);
11073 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11074 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011075}
11076
Karl Schultz6addd812016-02-02 17:17:23 -070011077TEST_F(VkLayerTest, NumSamplesMismatch) {
11078 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11079 // sampleCount
11080 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011081
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011083
Tony Barbour1fa09702017-03-16 12:09:08 -060011084 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011085 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011086 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011087 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011088 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011089
11090 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011091 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11092 ds_pool_ci.pNext = NULL;
11093 ds_pool_ci.maxSets = 1;
11094 ds_pool_ci.poolSizeCount = 1;
11095 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011096
Tobin Ehlis3b780662015-05-28 12:11:26 -060011097 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011098 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011099 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011100
Tony Barboureb254902015-07-15 12:50:33 -060011101 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011102 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011103 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011104 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011105 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11106 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011107
Tony Barboureb254902015-07-15 12:50:33 -060011108 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11109 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11110 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011111 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011112 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011113
Tobin Ehlis3b780662015-05-28 12:11:26 -060011114 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011115 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011116 ASSERT_VK_SUCCESS(err);
11117
11118 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011119 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011120 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011121 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011122 alloc_info.descriptorPool = ds_pool;
11123 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011124 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011125 ASSERT_VK_SUCCESS(err);
11126
Tony Barboureb254902015-07-15 12:50:33 -060011127 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011128 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011129 pipe_ms_state_ci.pNext = NULL;
11130 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11131 pipe_ms_state_ci.sampleShadingEnable = 0;
11132 pipe_ms_state_ci.minSampleShading = 1.0;
11133 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011134
Tony Barboureb254902015-07-15 12:50:33 -060011135 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011136 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11137 pipeline_layout_ci.pNext = NULL;
11138 pipeline_layout_ci.setLayoutCount = 1;
11139 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011140
11141 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011142 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011143 ASSERT_VK_SUCCESS(err);
11144
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011145 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011146 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 -060011147 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011148 VkPipelineObj pipe(m_device);
11149 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011150 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011151 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011152 pipe.SetMSAA(&pipe_ms_state_ci);
11153 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011154
Tony Barbour552f6c02016-12-21 14:34:07 -070011155 m_commandBuffer->BeginCommandBuffer();
11156 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011157 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011158
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011159 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11160 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11161 VkRect2D scissor = {{0, 0}, {16, 16}};
11162 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11163
Mark Young29927482016-05-04 14:38:51 -060011164 // Render triangle (the error should trigger on the attempt to draw).
11165 Draw(3, 1, 0, 0);
11166
11167 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011168 m_commandBuffer->EndRenderPass();
11169 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011170
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011171 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011172
Chia-I Wuf7458c52015-10-26 21:10:41 +080011173 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11174 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11175 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011176}
Mark Young29927482016-05-04 14:38:51 -060011177
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011178TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011179 TEST_DESCRIPTION(
11180 "Hit RenderPass incompatible cases. "
11181 "Initial case is drawing with an active renderpass that's "
11182 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011183 VkResult err;
11184
Tony Barbour1fa09702017-03-16 12:09:08 -060011185 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011186 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11187
11188 VkDescriptorSetLayoutBinding dsl_binding = {};
11189 dsl_binding.binding = 0;
11190 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11191 dsl_binding.descriptorCount = 1;
11192 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11193 dsl_binding.pImmutableSamplers = NULL;
11194
11195 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11196 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11197 ds_layout_ci.pNext = NULL;
11198 ds_layout_ci.bindingCount = 1;
11199 ds_layout_ci.pBindings = &dsl_binding;
11200
11201 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011202 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011203 ASSERT_VK_SUCCESS(err);
11204
11205 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11206 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11207 pipeline_layout_ci.pNext = NULL;
11208 pipeline_layout_ci.setLayoutCount = 1;
11209 pipeline_layout_ci.pSetLayouts = &ds_layout;
11210
11211 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011212 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011213 ASSERT_VK_SUCCESS(err);
11214
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011215 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011216 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 -060011217 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011218 // Create a renderpass that will be incompatible with default renderpass
11219 VkAttachmentReference attach = {};
11220 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11221 VkAttachmentReference color_att = {};
11222 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11223 VkSubpassDescription subpass = {};
11224 subpass.inputAttachmentCount = 1;
11225 subpass.pInputAttachments = &attach;
11226 subpass.colorAttachmentCount = 1;
11227 subpass.pColorAttachments = &color_att;
11228 VkRenderPassCreateInfo rpci = {};
11229 rpci.subpassCount = 1;
11230 rpci.pSubpasses = &subpass;
11231 rpci.attachmentCount = 1;
11232 VkAttachmentDescription attach_desc = {};
11233 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011234 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11235 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011236 rpci.pAttachments = &attach_desc;
11237 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11238 VkRenderPass rp;
11239 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11240 VkPipelineObj pipe(m_device);
11241 pipe.AddShader(&vs);
11242 pipe.AddShader(&fs);
11243 pipe.AddColorAttachment();
11244 VkViewport view_port = {};
11245 m_viewports.push_back(view_port);
11246 pipe.SetViewport(m_viewports);
11247 VkRect2D rect = {};
11248 m_scissors.push_back(rect);
11249 pipe.SetScissor(m_scissors);
11250 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11251
11252 VkCommandBufferInheritanceInfo cbii = {};
11253 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11254 cbii.renderPass = rp;
11255 cbii.subpass = 0;
11256 VkCommandBufferBeginInfo cbbi = {};
11257 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11258 cbbi.pInheritanceInfo = &cbii;
11259 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11260 VkRenderPassBeginInfo rpbi = {};
11261 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11262 rpbi.framebuffer = m_framebuffer;
11263 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011264 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11265 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011266
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011268 // Render triangle (the error should trigger on the attempt to draw).
11269 Draw(3, 1, 0, 0);
11270
11271 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011272 m_commandBuffer->EndRenderPass();
11273 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011274
11275 m_errorMonitor->VerifyFound();
11276
11277 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11278 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11279 vkDestroyRenderPass(m_device->device(), rp, NULL);
11280}
11281
Mark Youngc89c6312016-03-31 16:03:20 -060011282TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11283 // Create Pipeline where the number of blend attachments doesn't match the
11284 // number of color attachments. In this case, we don't add any color
11285 // blend attachments even though we have a color attachment.
11286 VkResult err;
11287
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011289
Tony Barbour1fa09702017-03-16 12:09:08 -060011290 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011291 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11292 VkDescriptorPoolSize ds_type_count = {};
11293 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11294 ds_type_count.descriptorCount = 1;
11295
11296 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11297 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11298 ds_pool_ci.pNext = NULL;
11299 ds_pool_ci.maxSets = 1;
11300 ds_pool_ci.poolSizeCount = 1;
11301 ds_pool_ci.pPoolSizes = &ds_type_count;
11302
11303 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011304 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011305 ASSERT_VK_SUCCESS(err);
11306
11307 VkDescriptorSetLayoutBinding dsl_binding = {};
11308 dsl_binding.binding = 0;
11309 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11310 dsl_binding.descriptorCount = 1;
11311 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11312 dsl_binding.pImmutableSamplers = NULL;
11313
11314 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11315 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11316 ds_layout_ci.pNext = NULL;
11317 ds_layout_ci.bindingCount = 1;
11318 ds_layout_ci.pBindings = &dsl_binding;
11319
11320 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011321 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011322 ASSERT_VK_SUCCESS(err);
11323
11324 VkDescriptorSet descriptorSet;
11325 VkDescriptorSetAllocateInfo alloc_info = {};
11326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11327 alloc_info.descriptorSetCount = 1;
11328 alloc_info.descriptorPool = ds_pool;
11329 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011330 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011331 ASSERT_VK_SUCCESS(err);
11332
11333 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011334 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011335 pipe_ms_state_ci.pNext = NULL;
11336 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11337 pipe_ms_state_ci.sampleShadingEnable = 0;
11338 pipe_ms_state_ci.minSampleShading = 1.0;
11339 pipe_ms_state_ci.pSampleMask = NULL;
11340
11341 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11342 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11343 pipeline_layout_ci.pNext = NULL;
11344 pipeline_layout_ci.setLayoutCount = 1;
11345 pipeline_layout_ci.pSetLayouts = &ds_layout;
11346
11347 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011348 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011349 ASSERT_VK_SUCCESS(err);
11350
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011351 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011352 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 -060011353 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011354 VkPipelineObj pipe(m_device);
11355 pipe.AddShader(&vs);
11356 pipe.AddShader(&fs);
11357 pipe.SetMSAA(&pipe_ms_state_ci);
11358 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011359 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011360
11361 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11362 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11363 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11364}
Mark Young29927482016-05-04 14:38:51 -060011365
Mark Muellerd4914412016-06-13 17:52:06 -060011366TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011367 TEST_DESCRIPTION(
11368 "Points to a wrong colorAttachment index in a VkClearAttachment "
11369 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011370 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011372
11373 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11374 m_errorMonitor->VerifyFound();
11375}
11376
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011377TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011378 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11379 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011380
Tony Barbour1fa09702017-03-16 12:09:08 -060011381 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011383
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011384 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011385 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11386 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011387
11388 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011389 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11390 ds_pool_ci.pNext = NULL;
11391 ds_pool_ci.maxSets = 1;
11392 ds_pool_ci.poolSizeCount = 1;
11393 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011394
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011395 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011396 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011397 ASSERT_VK_SUCCESS(err);
11398
Tony Barboureb254902015-07-15 12:50:33 -060011399 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011400 dsl_binding.binding = 0;
11401 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11402 dsl_binding.descriptorCount = 1;
11403 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11404 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011405
Tony Barboureb254902015-07-15 12:50:33 -060011406 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011407 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11408 ds_layout_ci.pNext = NULL;
11409 ds_layout_ci.bindingCount = 1;
11410 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011411
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011412 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011413 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011414 ASSERT_VK_SUCCESS(err);
11415
11416 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011417 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011418 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011419 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011420 alloc_info.descriptorPool = ds_pool;
11421 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011422 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011423 ASSERT_VK_SUCCESS(err);
11424
Tony Barboureb254902015-07-15 12:50:33 -060011425 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011426 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011427 pipe_ms_state_ci.pNext = NULL;
11428 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11429 pipe_ms_state_ci.sampleShadingEnable = 0;
11430 pipe_ms_state_ci.minSampleShading = 1.0;
11431 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011432
Tony Barboureb254902015-07-15 12:50:33 -060011433 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011434 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11435 pipeline_layout_ci.pNext = NULL;
11436 pipeline_layout_ci.setLayoutCount = 1;
11437 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011438
11439 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011440 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011441 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011442
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011443 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011444 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011445 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011446 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011447
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011448 VkPipelineObj pipe(m_device);
11449 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011450 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011451 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011452 pipe.SetMSAA(&pipe_ms_state_ci);
11453 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011454
Tony Barbour552f6c02016-12-21 14:34:07 -070011455 m_commandBuffer->BeginCommandBuffer();
11456 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011457
Karl Schultz6addd812016-02-02 17:17:23 -070011458 // Main thing we care about for this test is that the VkImage obj we're
11459 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011460 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011461 VkClearAttachment color_attachment;
11462 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11463 color_attachment.clearValue.color.float32[0] = 1.0;
11464 color_attachment.clearValue.color.float32[1] = 1.0;
11465 color_attachment.clearValue.color.float32[2] = 1.0;
11466 color_attachment.clearValue.color.float32[3] = 1.0;
11467 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011468 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011469
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011470 // Call for full-sized FB Color attachment prior to issuing a Draw
11471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011472 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011473 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011474 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011475
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011476 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11477 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11479 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11480 m_errorMonitor->VerifyFound();
11481
11482 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11483 clear_rect.layerCount = 2;
11484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11485 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011486 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011487
Chia-I Wuf7458c52015-10-26 21:10:41 +080011488 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11489 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11490 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011491}
11492
Karl Schultz6addd812016-02-02 17:17:23 -070011493TEST_F(VkLayerTest, VtxBufferBadIndex) {
11494 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011495
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11497 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011498
Tony Barbour1fa09702017-03-16 12:09:08 -060011499 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011500 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011501 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011502
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011503 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011504 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11505 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011506
11507 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011508 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11509 ds_pool_ci.pNext = NULL;
11510 ds_pool_ci.maxSets = 1;
11511 ds_pool_ci.poolSizeCount = 1;
11512 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011513
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011514 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011515 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011516 ASSERT_VK_SUCCESS(err);
11517
Tony Barboureb254902015-07-15 12:50:33 -060011518 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011519 dsl_binding.binding = 0;
11520 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11521 dsl_binding.descriptorCount = 1;
11522 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11523 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011524
Tony Barboureb254902015-07-15 12:50:33 -060011525 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011526 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11527 ds_layout_ci.pNext = NULL;
11528 ds_layout_ci.bindingCount = 1;
11529 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011530
Tobin Ehlis502480b2015-06-24 15:53:07 -060011531 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011532 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011533 ASSERT_VK_SUCCESS(err);
11534
11535 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011536 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011537 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011538 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011539 alloc_info.descriptorPool = ds_pool;
11540 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011541 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011542 ASSERT_VK_SUCCESS(err);
11543
Tony Barboureb254902015-07-15 12:50:33 -060011544 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011545 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011546 pipe_ms_state_ci.pNext = NULL;
11547 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11548 pipe_ms_state_ci.sampleShadingEnable = 0;
11549 pipe_ms_state_ci.minSampleShading = 1.0;
11550 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011551
Tony Barboureb254902015-07-15 12:50:33 -060011552 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011553 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11554 pipeline_layout_ci.pNext = NULL;
11555 pipeline_layout_ci.setLayoutCount = 1;
11556 pipeline_layout_ci.pSetLayouts = &ds_layout;
11557 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011558
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011559 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011560 ASSERT_VK_SUCCESS(err);
11561
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011562 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011563 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 -060011564 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011565 VkPipelineObj pipe(m_device);
11566 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011567 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011568 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011569 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011570 pipe.SetViewport(m_viewports);
11571 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011572 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011573
Tony Barbour552f6c02016-12-21 14:34:07 -070011574 m_commandBuffer->BeginCommandBuffer();
11575 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011576 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011577 // Don't care about actual data, just need to get to draw to flag error
11578 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011579 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011580 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011581 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011582
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011583 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011584
Chia-I Wuf7458c52015-10-26 21:10:41 +080011585 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11586 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11587 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011588}
Mark Muellerdfe37552016-07-07 14:47:42 -060011589
Mark Mueller2ee294f2016-08-04 12:59:48 -060011590TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011591 TEST_DESCRIPTION(
11592 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11593 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011594 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011595
Mark Mueller880fce52016-08-17 15:23:23 -060011596 // The following test fails with recent NVidia drivers.
11597 // By the time core_validation is reached, the NVidia
11598 // driver has sanitized the invalid condition and core_validation
11599 // is not introduced to the failure condition. This is not the case
11600 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011601 // uint32_t count = static_cast<uint32_t>(~0);
11602 // VkPhysicalDevice physical_device;
11603 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11604 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011605
Mark Mueller2ee294f2016-08-04 12:59:48 -060011606 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011607 VkDeviceQueueCreateInfo queue_create_info = {};
11608 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11609 queue_create_info.queueCount = 1;
11610 queue_create_info.pQueuePriorities = &queue_priority;
11611 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11612
11613 VkPhysicalDeviceFeatures features = m_device->phy().features();
11614 VkDevice testDevice;
11615 VkDeviceCreateInfo device_create_info = {};
11616 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11617 device_create_info.queueCreateInfoCount = 1;
11618 device_create_info.pQueueCreateInfos = &queue_create_info;
11619 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011620
11621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11622 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011623 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11624 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11625 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011626 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11627 m_errorMonitor->VerifyFound();
11628
11629 queue_create_info.queueFamilyIndex = 1;
11630
11631 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11632 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11633 for (unsigned i = 0; i < feature_count; i++) {
11634 if (VK_FALSE == feature_array[i]) {
11635 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011636 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11638 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011639 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11640 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11641 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11643 "You requested features that are unavailable on this device. You should first "
11644 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011645 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11646 m_errorMonitor->VerifyFound();
11647 break;
11648 }
11649 }
11650}
11651
Tobin Ehlis16edf082016-11-21 12:33:49 -070011652TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11653 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11654
Tony Barbour1fa09702017-03-16 12:09:08 -060011655 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011656
11657 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11658 std::vector<VkDeviceQueueCreateInfo> queue_info;
11659 queue_info.reserve(queue_props.size());
11660 std::vector<std::vector<float>> queue_priorities;
11661 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11662 VkDeviceQueueCreateInfo qi{};
11663 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11664 qi.queueFamilyIndex = i;
11665 qi.queueCount = queue_props[i].queueCount;
11666 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11667 qi.pQueuePriorities = queue_priorities[i].data();
11668 queue_info.push_back(qi);
11669 }
11670
11671 std::vector<const char *> device_extension_names;
11672
11673 VkDevice local_device;
11674 VkDeviceCreateInfo device_create_info = {};
11675 auto features = m_device->phy().features();
11676 // Intentionally disable pipeline stats
11677 features.pipelineStatisticsQuery = VK_FALSE;
11678 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11679 device_create_info.pNext = NULL;
11680 device_create_info.queueCreateInfoCount = queue_info.size();
11681 device_create_info.pQueueCreateInfos = queue_info.data();
11682 device_create_info.enabledLayerCount = 0;
11683 device_create_info.ppEnabledLayerNames = NULL;
11684 device_create_info.pEnabledFeatures = &features;
11685 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11686 ASSERT_VK_SUCCESS(err);
11687
11688 VkQueryPoolCreateInfo qpci{};
11689 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11690 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11691 qpci.queryCount = 1;
11692 VkQueryPool query_pool;
11693
11694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11695 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11696 m_errorMonitor->VerifyFound();
11697
11698 vkDestroyDevice(local_device, nullptr);
11699}
11700
Mark Mueller2ee294f2016-08-04 12:59:48 -060011701TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011702 TEST_DESCRIPTION(
11703 "Use an invalid queue index in a vkCmdWaitEvents call."
11704 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011706 const char *invalid_queue_index =
11707 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11708 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11709 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011710
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011711 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011712
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011714
Tony Barbour1fa09702017-03-16 12:09:08 -060011715 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011716
11717 VkEvent event;
11718 VkEventCreateInfo event_create_info{};
11719 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11720 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11721
Mark Mueller2ee294f2016-08-04 12:59:48 -060011722 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011723 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011724
Tony Barbour552f6c02016-12-21 14:34:07 -070011725 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011726
11727 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060011728 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 -060011729 ASSERT_TRUE(image.initialized());
11730 VkImageMemoryBarrier img_barrier = {};
11731 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11732 img_barrier.pNext = NULL;
11733 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11734 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11735 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11736 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11737 img_barrier.image = image.handle();
11738 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011739
11740 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11741 // that layer validation catches the case when it is not.
11742 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011743 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11744 img_barrier.subresourceRange.baseArrayLayer = 0;
11745 img_barrier.subresourceRange.baseMipLevel = 0;
11746 img_barrier.subresourceRange.layerCount = 1;
11747 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011748 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11749 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011750 m_errorMonitor->VerifyFound();
11751
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011753
11754 VkQueryPool query_pool;
11755 VkQueryPoolCreateInfo query_pool_create_info = {};
11756 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11757 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11758 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011759 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011760
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011761 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011762 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11763
11764 vkEndCommandBuffer(m_commandBuffer->handle());
11765 m_errorMonitor->VerifyFound();
11766
11767 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11768 vkDestroyEvent(m_device->device(), event, nullptr);
11769}
11770
Mark Muellerdfe37552016-07-07 14:47:42 -060011771TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011772 TEST_DESCRIPTION(
11773 "Submit a command buffer using deleted vertex buffer, "
11774 "delete a buffer twice, use an invalid offset for each "
11775 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011776
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011777 const char *deleted_buffer_in_command_buffer =
11778 "Cannot submit cmd buffer "
11779 "using deleted buffer ";
11780 const char *invalid_offset_message =
11781 "vkBindBufferMemory(): "
11782 "memoryOffset is 0x";
11783 const char *invalid_storage_buffer_offset_message =
11784 "vkBindBufferMemory(): "
11785 "storage memoryOffset "
11786 "is 0x";
11787 const char *invalid_texel_buffer_offset_message =
11788 "vkBindBufferMemory(): "
11789 "texel memoryOffset "
11790 "is 0x";
11791 const char *invalid_uniform_buffer_offset_message =
11792 "vkBindBufferMemory(): "
11793 "uniform memoryOffset "
11794 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011795
Tony Barbour1fa09702017-03-16 12:09:08 -060011796 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011797 ASSERT_NO_FATAL_FAILURE(InitViewport());
11798 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11799
11800 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011801 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011802 pipe_ms_state_ci.pNext = NULL;
11803 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11804 pipe_ms_state_ci.sampleShadingEnable = 0;
11805 pipe_ms_state_ci.minSampleShading = 1.0;
11806 pipe_ms_state_ci.pSampleMask = nullptr;
11807
11808 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11809 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11810 VkPipelineLayout pipeline_layout;
11811
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011812 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011813 ASSERT_VK_SUCCESS(err);
11814
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011815 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11816 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011817 VkPipelineObj pipe(m_device);
11818 pipe.AddShader(&vs);
11819 pipe.AddShader(&fs);
11820 pipe.AddColorAttachment();
11821 pipe.SetMSAA(&pipe_ms_state_ci);
11822 pipe.SetViewport(m_viewports);
11823 pipe.SetScissor(m_scissors);
11824 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11825
Tony Barbour552f6c02016-12-21 14:34:07 -070011826 m_commandBuffer->BeginCommandBuffer();
11827 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011828 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011829
11830 {
11831 // Create and bind a vertex buffer in a reduced scope, which will cause
11832 // it to be deleted upon leaving this scope
11833 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011834 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011835 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11836 draw_verticies.AddVertexInputToPipe(pipe);
11837 }
11838
11839 Draw(1, 0, 0, 0);
11840
Tony Barbour552f6c02016-12-21 14:34:07 -070011841 m_commandBuffer->EndRenderPass();
11842 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011843
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011845 QueueCommandBuffer(false);
11846 m_errorMonitor->VerifyFound();
11847
11848 {
11849 // Create and bind a vertex buffer in a reduced scope, and delete it
11850 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011851 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011853 buffer_test.TestDoubleDestroy();
11854 }
11855 m_errorMonitor->VerifyFound();
11856
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011857 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011858 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011859 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011861 m_errorMonitor->SetUnexpectedError(
11862 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11863 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011864 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11865 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011866 m_errorMonitor->VerifyFound();
11867 }
11868
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011869 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11870 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011871 // Create and bind a memory buffer with an invalid offset again,
11872 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011874 m_errorMonitor->SetUnexpectedError(
11875 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11876 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011877 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11878 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011879 m_errorMonitor->VerifyFound();
11880 }
11881
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011882 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011883 // Create and bind a memory buffer with an invalid offset again, but
11884 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011886 m_errorMonitor->SetUnexpectedError(
11887 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11888 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011889 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11890 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011891 m_errorMonitor->VerifyFound();
11892 }
11893
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011894 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011895 // Create and bind a memory buffer with an invalid offset again, but
11896 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011898 m_errorMonitor->SetUnexpectedError(
11899 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11900 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011901 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11902 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011903 m_errorMonitor->VerifyFound();
11904 }
11905
11906 {
11907 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011909 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11910 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011911 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11912 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011913 m_errorMonitor->VerifyFound();
11914 }
11915
11916 {
11917 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011919 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11920 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011921 }
11922 m_errorMonitor->VerifyFound();
11923
11924 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11925}
11926
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011927// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11928TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011929 TEST_DESCRIPTION(
11930 "Hit all possible validation checks associated with the "
11931 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11932 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011933 // 3 in ValidateCmdBufImageLayouts
11934 // * -1 Attempt to submit cmd buf w/ deleted image
11935 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11936 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011937
Tony Barbour1fa09702017-03-16 12:09:08 -060011938 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011939 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011940 if (!depth_format) {
11941 printf(" No Depth + Stencil format found. Skipped.\n");
11942 return;
11943 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011944 // Create src & dst images to use for copy operations
11945 VkImage src_image;
11946 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011947 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011948
11949 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11950 const int32_t tex_width = 32;
11951 const int32_t tex_height = 32;
11952
11953 VkImageCreateInfo image_create_info = {};
11954 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11955 image_create_info.pNext = NULL;
11956 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11957 image_create_info.format = tex_format;
11958 image_create_info.extent.width = tex_width;
11959 image_create_info.extent.height = tex_height;
11960 image_create_info.extent.depth = 1;
11961 image_create_info.mipLevels = 1;
11962 image_create_info.arrayLayers = 4;
11963 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11964 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11965 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011966 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011967 image_create_info.flags = 0;
11968
11969 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11970 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011971 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011972 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11973 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011974 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11975 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11976 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11977 ASSERT_VK_SUCCESS(err);
11978
11979 // Allocate memory
11980 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011981 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011982 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011983 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11984 mem_alloc.pNext = NULL;
11985 mem_alloc.allocationSize = 0;
11986 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011987
11988 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011989 mem_alloc.allocationSize = img_mem_reqs.size;
11990 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011991 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011992 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011993 ASSERT_VK_SUCCESS(err);
11994
11995 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011996 mem_alloc.allocationSize = img_mem_reqs.size;
11997 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011998 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011999 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012000 ASSERT_VK_SUCCESS(err);
12001
12002 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012003 mem_alloc.allocationSize = img_mem_reqs.size;
12004 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012005 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012006 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012007 ASSERT_VK_SUCCESS(err);
12008
12009 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12010 ASSERT_VK_SUCCESS(err);
12011 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12012 ASSERT_VK_SUCCESS(err);
12013 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12014 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012015
Tony Barbour552f6c02016-12-21 14:34:07 -070012016 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012017 VkImageCopy copy_region;
12018 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12019 copy_region.srcSubresource.mipLevel = 0;
12020 copy_region.srcSubresource.baseArrayLayer = 0;
12021 copy_region.srcSubresource.layerCount = 1;
12022 copy_region.srcOffset.x = 0;
12023 copy_region.srcOffset.y = 0;
12024 copy_region.srcOffset.z = 0;
12025 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12026 copy_region.dstSubresource.mipLevel = 0;
12027 copy_region.dstSubresource.baseArrayLayer = 0;
12028 copy_region.dstSubresource.layerCount = 1;
12029 copy_region.dstOffset.x = 0;
12030 copy_region.dstOffset.y = 0;
12031 copy_region.dstOffset.z = 0;
12032 copy_region.extent.width = 1;
12033 copy_region.extent.height = 1;
12034 copy_region.extent.depth = 1;
12035
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12037 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12038 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012039
Cort530cf382016-12-08 09:59:47 -080012040 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 -060012041 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012042 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12043 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012044 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12045 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012046 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 -060012047 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012049 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12050 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012051 m_errorMonitor->SetUnexpectedError("srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080012052 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 -060012053 m_errorMonitor->VerifyFound();
12054 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012056 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012057 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012058 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012059 "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 -080012060 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 -060012061 m_errorMonitor->VerifyFound();
12062 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12064 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12065 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012066 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 -060012067 m_errorMonitor->VerifyFound();
12068 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012070 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012071 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012072 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012073 "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 -080012074 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 -060012075 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012077 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12078 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012079 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012080 "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 -080012081 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 -060012082 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012083
Cort3b021012016-12-07 12:00:57 -080012084 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12085 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12086 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12087 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12088 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12089 transfer_dst_image_barrier[0].srcAccessMask = 0;
12090 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12091 transfer_dst_image_barrier[0].image = dst_image;
12092 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12093 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12094 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12095 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12096 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12097 transfer_dst_image_barrier[0].image = depth_image;
12098 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12099 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12100 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12101
12102 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012103 VkClearColorValue color_clear_value = {};
12104 VkImageSubresourceRange clear_range;
12105 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12106 clear_range.baseMipLevel = 0;
12107 clear_range.baseArrayLayer = 0;
12108 clear_range.layerCount = 1;
12109 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012110
Cort3b021012016-12-07 12:00:57 -080012111 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12112 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012115 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012116 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012117 // Fail due to provided layout not matching actual current layout for color clear.
12118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012119 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012120 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012121
Cort530cf382016-12-08 09:59:47 -080012122 VkClearDepthStencilValue depth_clear_value = {};
12123 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012124
12125 // Fail due to explicitly prohibited layout for depth 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_01101);
12128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012129 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012130 m_errorMonitor->VerifyFound();
12131 // Fail due to provided layout not matching actual current layout for depth clear.
12132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012133 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012134 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012135
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012136 // Now cause error due to bad image layout transition in PipelineBarrier
12137 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012138 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012139 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012140 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012141 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012142 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12143 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012144 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012146 "you cannot transition the layout of aspect 1 from "
12147 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12148 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012150 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12151 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012152 m_errorMonitor->VerifyFound();
12153
12154 // Finally some layout errors at RenderPass create time
12155 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12156 VkAttachmentReference attach = {};
12157 // perf warning for GENERAL layout w/ non-DS input attachment
12158 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12159 VkSubpassDescription subpass = {};
12160 subpass.inputAttachmentCount = 1;
12161 subpass.pInputAttachments = &attach;
12162 VkRenderPassCreateInfo rpci = {};
12163 rpci.subpassCount = 1;
12164 rpci.pSubpasses = &subpass;
12165 rpci.attachmentCount = 1;
12166 VkAttachmentDescription attach_desc = {};
12167 attach_desc.format = VK_FORMAT_UNDEFINED;
12168 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012169 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012170 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12172 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012173 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12174 m_errorMonitor->VerifyFound();
12175 // error w/ non-general layout
12176 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12177
12178 m_errorMonitor->SetDesiredFailureMsg(
12179 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12180 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12181 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12182 m_errorMonitor->VerifyFound();
12183 subpass.inputAttachmentCount = 0;
12184 subpass.colorAttachmentCount = 1;
12185 subpass.pColorAttachments = &attach;
12186 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12187 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12189 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012190 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12191 m_errorMonitor->VerifyFound();
12192 // error w/ non-color opt or GENERAL layout for color attachment
12193 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12194 m_errorMonitor->SetDesiredFailureMsg(
12195 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12196 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12197 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12198 m_errorMonitor->VerifyFound();
12199 subpass.colorAttachmentCount = 0;
12200 subpass.pDepthStencilAttachment = &attach;
12201 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12202 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12204 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012205 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12206 m_errorMonitor->VerifyFound();
12207 // error w/ non-ds opt or GENERAL layout for color attachment
12208 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12210 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12211 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012212 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12213 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012214 // For this error we need a valid renderpass so create default one
12215 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12216 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012217 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012218 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12219 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12220 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12221 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12222 // Can't do a CLEAR load on READ_ONLY initialLayout
12223 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12224 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12225 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012227 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012228 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12229 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012230
Cort3b021012016-12-07 12:00:57 -080012231 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12232 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12233 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012234 vkDestroyImage(m_device->device(), src_image, NULL);
12235 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012236 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012237}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012238
Tobin Ehlise0936662016-10-11 08:10:51 -060012239TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12240 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12241 VkResult err;
12242
Tony Barbour1fa09702017-03-16 12:09:08 -060012243 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012244
12245 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12246 VkImageTiling tiling;
12247 VkFormatProperties format_properties;
12248 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12249 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12250 tiling = VK_IMAGE_TILING_LINEAR;
12251 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12252 tiling = VK_IMAGE_TILING_OPTIMAL;
12253 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012254 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012255 return;
12256 }
12257
12258 VkDescriptorPoolSize ds_type = {};
12259 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12260 ds_type.descriptorCount = 1;
12261
12262 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12263 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12264 ds_pool_ci.maxSets = 1;
12265 ds_pool_ci.poolSizeCount = 1;
12266 ds_pool_ci.pPoolSizes = &ds_type;
12267 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12268
12269 VkDescriptorPool ds_pool;
12270 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12271 ASSERT_VK_SUCCESS(err);
12272
12273 VkDescriptorSetLayoutBinding dsl_binding = {};
12274 dsl_binding.binding = 0;
12275 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12276 dsl_binding.descriptorCount = 1;
12277 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12278 dsl_binding.pImmutableSamplers = NULL;
12279
12280 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12281 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12282 ds_layout_ci.pNext = NULL;
12283 ds_layout_ci.bindingCount = 1;
12284 ds_layout_ci.pBindings = &dsl_binding;
12285
12286 VkDescriptorSetLayout ds_layout;
12287 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12288 ASSERT_VK_SUCCESS(err);
12289
12290 VkDescriptorSetAllocateInfo alloc_info = {};
12291 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12292 alloc_info.descriptorSetCount = 1;
12293 alloc_info.descriptorPool = ds_pool;
12294 alloc_info.pSetLayouts = &ds_layout;
12295 VkDescriptorSet descriptor_set;
12296 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12297 ASSERT_VK_SUCCESS(err);
12298
12299 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12300 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12301 pipeline_layout_ci.pNext = NULL;
12302 pipeline_layout_ci.setLayoutCount = 1;
12303 pipeline_layout_ci.pSetLayouts = &ds_layout;
12304 VkPipelineLayout pipeline_layout;
12305 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12306 ASSERT_VK_SUCCESS(err);
12307
12308 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012309 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012310 ASSERT_TRUE(image.initialized());
12311 VkImageView view = image.targetView(tex_format);
12312
12313 VkDescriptorImageInfo image_info = {};
12314 image_info.imageView = view;
12315 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12316
12317 VkWriteDescriptorSet descriptor_write = {};
12318 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12319 descriptor_write.dstSet = descriptor_set;
12320 descriptor_write.dstBinding = 0;
12321 descriptor_write.descriptorCount = 1;
12322 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12323 descriptor_write.pImageInfo = &image_info;
12324
12325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12326 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12327 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12328 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12329 m_errorMonitor->VerifyFound();
12330
12331 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12332 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12333 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12334 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12335}
12336
Mark Mueller93b938f2016-08-18 10:27:40 -060012337TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012338 TEST_DESCRIPTION(
12339 "Use vkCmdExecuteCommands with invalid state "
12340 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012341
Tony Barbour1fa09702017-03-16 12:09:08 -060012342 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012343 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12344
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012345 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012346 const char *simultaneous_use_message2 =
12347 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12348 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012349
12350 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012351 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012352 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012353 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12354 command_buffer_allocate_info.commandBufferCount = 1;
12355
12356 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012357 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012358 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12359 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012360 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012361 command_buffer_inheritance_info.renderPass = m_renderPass;
12362 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012363
Mark Mueller93b938f2016-08-18 10:27:40 -060012364 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012365 command_buffer_begin_info.flags =
12366 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012367 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12368
12369 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12370 vkEndCommandBuffer(secondary_command_buffer);
12371
Mark Mueller93b938f2016-08-18 10:27:40 -060012372 VkSubmitInfo submit_info = {};
12373 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12374 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012375 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012376
Mark Mueller4042b652016-09-05 22:52:21 -060012377 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012378 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12380 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012381 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012382 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012383 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12384 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012385
Dave Houltonfbf52152017-01-06 12:55:29 -070012386 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012387 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012388 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012389
Mark Mueller4042b652016-09-05 22:52:21 -060012390 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012391 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012392 m_errorMonitor->SetUnexpectedError(
12393 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12394 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012395 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012396 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012397
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12399 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012400 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012401 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12402 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012403
12404 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012405
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012406 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012407}
12408
Tony Barbour626994c2017-02-08 15:29:37 -070012409TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12410 TEST_DESCRIPTION(
12411 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12412 "errors");
12413 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12414 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 -060012415 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012416
12417 VkCommandBuffer cmd_bufs[2];
12418 VkCommandBufferAllocateInfo alloc_info;
12419 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12420 alloc_info.pNext = NULL;
12421 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012422 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012423 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12424 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12425
12426 VkCommandBufferBeginInfo cb_binfo;
12427 cb_binfo.pNext = NULL;
12428 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12429 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12430 cb_binfo.flags = 0;
12431 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12432 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12433 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12434 vkEndCommandBuffer(cmd_bufs[0]);
12435 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12436
12437 VkSubmitInfo submit_info = {};
12438 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12439 submit_info.commandBufferCount = 2;
12440 submit_info.pCommandBuffers = duplicates;
12441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12442 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12443 m_errorMonitor->VerifyFound();
12444 vkQueueWaitIdle(m_device->m_queue);
12445
12446 // Set one time use and now look for one time submit
12447 duplicates[0] = duplicates[1] = cmd_bufs[1];
12448 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12449 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12450 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12451 vkEndCommandBuffer(cmd_bufs[1]);
12452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12453 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12454 m_errorMonitor->VerifyFound();
12455 vkQueueWaitIdle(m_device->m_queue);
12456}
12457
Tobin Ehlisb093da82017-01-19 12:05:27 -070012458TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012459 TEST_DESCRIPTION(
12460 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12461 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012462
Tony Barbour1fa09702017-03-16 12:09:08 -060012463 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12465
12466 std::vector<const char *> device_extension_names;
12467 auto features = m_device->phy().features();
12468 // Make sure gs & ts are disabled
12469 features.geometryShader = false;
12470 features.tessellationShader = false;
12471 // The sacrificial device object
12472 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12473
12474 VkCommandPoolCreateInfo pool_create_info{};
12475 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12476 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12477
12478 VkCommandPool command_pool;
12479 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12480
12481 VkCommandBufferAllocateInfo cmd = {};
12482 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12483 cmd.pNext = NULL;
12484 cmd.commandPool = command_pool;
12485 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12486 cmd.commandBufferCount = 1;
12487
12488 VkCommandBuffer cmd_buffer;
12489 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12490 ASSERT_VK_SUCCESS(err);
12491
12492 VkEvent event;
12493 VkEventCreateInfo evci = {};
12494 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12495 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12496 ASSERT_VK_SUCCESS(result);
12497
12498 VkCommandBufferBeginInfo cbbi = {};
12499 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12500 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12502 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12503 m_errorMonitor->VerifyFound();
12504
12505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12506 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12507 m_errorMonitor->VerifyFound();
12508
12509 vkDestroyEvent(test_device.handle(), event, NULL);
12510 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12511}
12512
Chris Forbesd70103a2017-04-13 11:34:09 -070012513TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060012514 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12516
Tony Barbour552f6c02016-12-21 14:34:07 -070012517 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012518
12519 VkEvent event;
12520 VkEventCreateInfo event_create_info = {};
12521 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12522 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012523 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012524
Tony Barbour552f6c02016-12-21 14:34:07 -070012525 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012526 vkDestroyEvent(m_device->device(), event, nullptr);
12527
12528 VkSubmitInfo submit_info = {};
12529 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12530 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012531 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012533 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12534 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070012535}
Mark Muellerc8d441e2016-08-23 17:36:00 -060012536
Chris Forbesd70103a2017-04-13 11:34:09 -070012537TEST_F(VkLayerTest, InUseDestroyedSignaled) {
12538 TEST_DESCRIPTION(
12539 "Use vkCmdExecuteCommands with invalid state "
12540 "in primary and secondary command buffers. "
12541 "Delete objects that are inuse. Call VkQueueSubmit "
12542 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012543
Chris Forbesd70103a2017-04-13 11:34:09 -070012544 ASSERT_NO_FATAL_FAILURE(Init());
12545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12546
12547 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012548
Mark Mueller917f6bc2016-08-30 10:57:19 -060012549 VkSemaphoreCreateInfo semaphore_create_info = {};
12550 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12551 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012552 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012553 VkFenceCreateInfo fence_create_info = {};
12554 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12555 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012556 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012557
12558 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012559 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012560 descriptor_pool_type_count.descriptorCount = 1;
12561
12562 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12563 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12564 descriptor_pool_create_info.maxSets = 1;
12565 descriptor_pool_create_info.poolSizeCount = 1;
12566 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012567 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012568
12569 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012570 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012571
12572 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012573 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012574 descriptorset_layout_binding.descriptorCount = 1;
12575 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12576
12577 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012578 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012579 descriptorset_layout_create_info.bindingCount = 1;
12580 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12581
12582 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012583 ASSERT_VK_SUCCESS(
12584 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012585
12586 VkDescriptorSet descriptorset;
12587 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012588 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012589 descriptorset_allocate_info.descriptorSetCount = 1;
12590 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12591 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012592 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012593
Mark Mueller4042b652016-09-05 22:52:21 -060012594 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12595
12596 VkDescriptorBufferInfo buffer_info = {};
12597 buffer_info.buffer = buffer_test.GetBuffer();
12598 buffer_info.offset = 0;
12599 buffer_info.range = 1024;
12600
12601 VkWriteDescriptorSet write_descriptor_set = {};
12602 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12603 write_descriptor_set.dstSet = descriptorset;
12604 write_descriptor_set.descriptorCount = 1;
12605 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12606 write_descriptor_set.pBufferInfo = &buffer_info;
12607
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012608 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012609
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012610 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12611 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012612
12613 VkPipelineObj pipe(m_device);
12614 pipe.AddColorAttachment();
12615 pipe.AddShader(&vs);
12616 pipe.AddShader(&fs);
12617
12618 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012619 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012620 pipeline_layout_create_info.setLayoutCount = 1;
12621 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12622
12623 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012624 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012625
12626 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12627
Chris Forbesd70103a2017-04-13 11:34:09 -070012628 VkEvent event;
12629 VkEventCreateInfo event_create_info = {};
12630 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12631 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12632
Tony Barbour552f6c02016-12-21 14:34:07 -070012633 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070012634
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012635 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012636
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012637 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12638 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12639 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012640
Tony Barbour552f6c02016-12-21 14:34:07 -070012641 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012642
Chris Forbesd70103a2017-04-13 11:34:09 -070012643 VkSubmitInfo submit_info = {};
12644 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12645 submit_info.commandBufferCount = 1;
12646 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012647 submit_info.signalSemaphoreCount = 1;
12648 submit_info.pSignalSemaphores = &semaphore;
12649 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012650 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012651
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012653 vkDestroyEvent(m_device->device(), event, nullptr);
12654 m_errorMonitor->VerifyFound();
12655
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012657 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12658 m_errorMonitor->VerifyFound();
12659
Jeremy Hayes08369882017-02-02 10:31:06 -070012660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012661 vkDestroyFence(m_device->device(), fence, nullptr);
12662 m_errorMonitor->VerifyFound();
12663
Tobin Ehlis122207b2016-09-01 08:50:06 -070012664 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012665 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12666 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012667 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012668 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12669 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012670 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012671 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12672 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012673 vkDestroyEvent(m_device->device(), event, nullptr);
12674 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012675 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012676 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12677}
12678
Tobin Ehlis2adda372016-09-01 08:51:06 -070012679TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12680 TEST_DESCRIPTION("Delete in-use query pool.");
12681
Tony Barbour1fa09702017-03-16 12:09:08 -060012682 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012683 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12684
12685 VkQueryPool query_pool;
12686 VkQueryPoolCreateInfo query_pool_ci{};
12687 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12688 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12689 query_pool_ci.queryCount = 1;
12690 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012691 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012692 // Reset query pool to create binding with cmd buffer
12693 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12694
Tony Barbour552f6c02016-12-21 14:34:07 -070012695 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012696
12697 VkSubmitInfo submit_info = {};
12698 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12699 submit_info.commandBufferCount = 1;
12700 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12701 // Submit cmd buffer and then destroy query pool while in-flight
12702 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12703
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012705 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12706 m_errorMonitor->VerifyFound();
12707
12708 vkQueueWaitIdle(m_device->m_queue);
12709 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012710 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012711 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012712 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12713}
12714
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012715TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12716 TEST_DESCRIPTION("Delete in-use pipeline.");
12717
Tony Barbour1fa09702017-03-16 12:09:08 -060012718 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012719 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12720
12721 // Empty pipeline layout used for binding PSO
12722 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12723 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12724 pipeline_layout_ci.setLayoutCount = 0;
12725 pipeline_layout_ci.pSetLayouts = NULL;
12726
12727 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012728 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012729 ASSERT_VK_SUCCESS(err);
12730
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012732 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012733 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12734 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012735 // Store pipeline handle so we can actually delete it before test finishes
12736 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012737 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012738 VkPipelineObj pipe(m_device);
12739 pipe.AddShader(&vs);
12740 pipe.AddShader(&fs);
12741 pipe.AddColorAttachment();
12742 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12743 delete_this_pipeline = pipe.handle();
12744
Tony Barbour552f6c02016-12-21 14:34:07 -070012745 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012746 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012747 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012748
Tony Barbour552f6c02016-12-21 14:34:07 -070012749 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012750
12751 VkSubmitInfo submit_info = {};
12752 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12753 submit_info.commandBufferCount = 1;
12754 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12755 // Submit cmd buffer and then pipeline destroyed while in-flight
12756 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012757 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012758 m_errorMonitor->VerifyFound();
12759 // Make sure queue finished and then actually delete pipeline
12760 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012761 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12762 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012763 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12764 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12765}
12766
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012767TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12768 TEST_DESCRIPTION("Delete in-use imageView.");
12769
Tony Barbour1fa09702017-03-16 12:09:08 -060012770 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012771 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12772
12773 VkDescriptorPoolSize ds_type_count;
12774 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12775 ds_type_count.descriptorCount = 1;
12776
12777 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12778 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12779 ds_pool_ci.maxSets = 1;
12780 ds_pool_ci.poolSizeCount = 1;
12781 ds_pool_ci.pPoolSizes = &ds_type_count;
12782
12783 VkDescriptorPool ds_pool;
12784 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12785 ASSERT_VK_SUCCESS(err);
12786
12787 VkSamplerCreateInfo sampler_ci = {};
12788 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12789 sampler_ci.pNext = NULL;
12790 sampler_ci.magFilter = VK_FILTER_NEAREST;
12791 sampler_ci.minFilter = VK_FILTER_NEAREST;
12792 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12793 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12794 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12795 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12796 sampler_ci.mipLodBias = 1.0;
12797 sampler_ci.anisotropyEnable = VK_FALSE;
12798 sampler_ci.maxAnisotropy = 1;
12799 sampler_ci.compareEnable = VK_FALSE;
12800 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12801 sampler_ci.minLod = 1.0;
12802 sampler_ci.maxLod = 1.0;
12803 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12804 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12805 VkSampler sampler;
12806
12807 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12808 ASSERT_VK_SUCCESS(err);
12809
12810 VkDescriptorSetLayoutBinding layout_binding;
12811 layout_binding.binding = 0;
12812 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12813 layout_binding.descriptorCount = 1;
12814 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12815 layout_binding.pImmutableSamplers = NULL;
12816
12817 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12818 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12819 ds_layout_ci.bindingCount = 1;
12820 ds_layout_ci.pBindings = &layout_binding;
12821 VkDescriptorSetLayout ds_layout;
12822 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12823 ASSERT_VK_SUCCESS(err);
12824
12825 VkDescriptorSetAllocateInfo alloc_info = {};
12826 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12827 alloc_info.descriptorSetCount = 1;
12828 alloc_info.descriptorPool = ds_pool;
12829 alloc_info.pSetLayouts = &ds_layout;
12830 VkDescriptorSet descriptor_set;
12831 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12832 ASSERT_VK_SUCCESS(err);
12833
12834 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12835 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12836 pipeline_layout_ci.pNext = NULL;
12837 pipeline_layout_ci.setLayoutCount = 1;
12838 pipeline_layout_ci.pSetLayouts = &ds_layout;
12839
12840 VkPipelineLayout pipeline_layout;
12841 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12842 ASSERT_VK_SUCCESS(err);
12843
12844 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012845 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 -060012846 ASSERT_TRUE(image.initialized());
12847
12848 VkImageView view;
12849 VkImageViewCreateInfo ivci = {};
12850 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12851 ivci.image = image.handle();
12852 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12853 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12854 ivci.subresourceRange.layerCount = 1;
12855 ivci.subresourceRange.baseMipLevel = 0;
12856 ivci.subresourceRange.levelCount = 1;
12857 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12858
12859 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12860 ASSERT_VK_SUCCESS(err);
12861
12862 VkDescriptorImageInfo image_info{};
12863 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12864 image_info.imageView = view;
12865 image_info.sampler = sampler;
12866
12867 VkWriteDescriptorSet descriptor_write = {};
12868 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12869 descriptor_write.dstSet = descriptor_set;
12870 descriptor_write.dstBinding = 0;
12871 descriptor_write.descriptorCount = 1;
12872 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12873 descriptor_write.pImageInfo = &image_info;
12874
12875 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12876
12877 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012878 char const *vsSource =
12879 "#version 450\n"
12880 "\n"
12881 "out gl_PerVertex { \n"
12882 " vec4 gl_Position;\n"
12883 "};\n"
12884 "void main(){\n"
12885 " gl_Position = vec4(1);\n"
12886 "}\n";
12887 char const *fsSource =
12888 "#version 450\n"
12889 "\n"
12890 "layout(set=0, binding=0) uniform sampler2D s;\n"
12891 "layout(location=0) out vec4 x;\n"
12892 "void main(){\n"
12893 " x = texture(s, vec2(1));\n"
12894 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012895 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12896 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12897 VkPipelineObj pipe(m_device);
12898 pipe.AddShader(&vs);
12899 pipe.AddShader(&fs);
12900 pipe.AddColorAttachment();
12901 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12902
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012904
Tony Barbour552f6c02016-12-21 14:34:07 -070012905 m_commandBuffer->BeginCommandBuffer();
12906 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012907 // Bind pipeline to cmd buffer
12908 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12909 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12910 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012911
12912 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12913 VkRect2D scissor = {{0, 0}, {16, 16}};
12914 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12915 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12916
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012917 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012918 m_commandBuffer->EndRenderPass();
12919 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012920 // Submit cmd buffer then destroy sampler
12921 VkSubmitInfo submit_info = {};
12922 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12923 submit_info.commandBufferCount = 1;
12924 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12925 // Submit cmd buffer and then destroy imageView while in-flight
12926 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12927
12928 vkDestroyImageView(m_device->device(), view, nullptr);
12929 m_errorMonitor->VerifyFound();
12930 vkQueueWaitIdle(m_device->m_queue);
12931 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012932 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012933 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012934 vkDestroyImageView(m_device->device(), view, NULL);
12935 vkDestroySampler(m_device->device(), sampler, nullptr);
12936 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12937 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12938 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12939}
12940
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012941TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12942 TEST_DESCRIPTION("Delete in-use bufferView.");
12943
Tony Barbour1fa09702017-03-16 12:09:08 -060012944 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012945 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12946
12947 VkDescriptorPoolSize ds_type_count;
12948 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12949 ds_type_count.descriptorCount = 1;
12950
12951 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12952 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12953 ds_pool_ci.maxSets = 1;
12954 ds_pool_ci.poolSizeCount = 1;
12955 ds_pool_ci.pPoolSizes = &ds_type_count;
12956
12957 VkDescriptorPool ds_pool;
12958 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12959 ASSERT_VK_SUCCESS(err);
12960
12961 VkDescriptorSetLayoutBinding layout_binding;
12962 layout_binding.binding = 0;
12963 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12964 layout_binding.descriptorCount = 1;
12965 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12966 layout_binding.pImmutableSamplers = NULL;
12967
12968 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12969 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12970 ds_layout_ci.bindingCount = 1;
12971 ds_layout_ci.pBindings = &layout_binding;
12972 VkDescriptorSetLayout ds_layout;
12973 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12974 ASSERT_VK_SUCCESS(err);
12975
12976 VkDescriptorSetAllocateInfo alloc_info = {};
12977 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12978 alloc_info.descriptorSetCount = 1;
12979 alloc_info.descriptorPool = ds_pool;
12980 alloc_info.pSetLayouts = &ds_layout;
12981 VkDescriptorSet descriptor_set;
12982 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12983 ASSERT_VK_SUCCESS(err);
12984
12985 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12986 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12987 pipeline_layout_ci.pNext = NULL;
12988 pipeline_layout_ci.setLayoutCount = 1;
12989 pipeline_layout_ci.pSetLayouts = &ds_layout;
12990
12991 VkPipelineLayout pipeline_layout;
12992 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12993 ASSERT_VK_SUCCESS(err);
12994
12995 VkBuffer buffer;
12996 uint32_t queue_family_index = 0;
12997 VkBufferCreateInfo buffer_create_info = {};
12998 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12999 buffer_create_info.size = 1024;
13000 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13001 buffer_create_info.queueFamilyIndexCount = 1;
13002 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13003
13004 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13005 ASSERT_VK_SUCCESS(err);
13006
13007 VkMemoryRequirements memory_reqs;
13008 VkDeviceMemory buffer_memory;
13009
13010 VkMemoryAllocateInfo memory_info = {};
13011 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13012 memory_info.allocationSize = 0;
13013 memory_info.memoryTypeIndex = 0;
13014
13015 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13016 memory_info.allocationSize = memory_reqs.size;
13017 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13018 ASSERT_TRUE(pass);
13019
13020 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13021 ASSERT_VK_SUCCESS(err);
13022 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13023 ASSERT_VK_SUCCESS(err);
13024
13025 VkBufferView view;
13026 VkBufferViewCreateInfo bvci = {};
13027 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13028 bvci.buffer = buffer;
13029 bvci.format = VK_FORMAT_R8_UNORM;
13030 bvci.range = VK_WHOLE_SIZE;
13031
13032 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13033 ASSERT_VK_SUCCESS(err);
13034
13035 VkWriteDescriptorSet descriptor_write = {};
13036 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13037 descriptor_write.dstSet = descriptor_set;
13038 descriptor_write.dstBinding = 0;
13039 descriptor_write.descriptorCount = 1;
13040 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13041 descriptor_write.pTexelBufferView = &view;
13042
13043 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13044
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013045 char const *vsSource =
13046 "#version 450\n"
13047 "\n"
13048 "out gl_PerVertex { \n"
13049 " vec4 gl_Position;\n"
13050 "};\n"
13051 "void main(){\n"
13052 " gl_Position = vec4(1);\n"
13053 "}\n";
13054 char const *fsSource =
13055 "#version 450\n"
13056 "\n"
13057 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13058 "layout(location=0) out vec4 x;\n"
13059 "void main(){\n"
13060 " x = imageLoad(s, 0);\n"
13061 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013062 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13063 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13064 VkPipelineObj pipe(m_device);
13065 pipe.AddShader(&vs);
13066 pipe.AddShader(&fs);
13067 pipe.AddColorAttachment();
13068 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13069
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013071
Tony Barbour552f6c02016-12-21 14:34:07 -070013072 m_commandBuffer->BeginCommandBuffer();
13073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013074 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13075 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13076 VkRect2D scissor = {{0, 0}, {16, 16}};
13077 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13078 // Bind pipeline to cmd buffer
13079 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13080 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13081 &descriptor_set, 0, nullptr);
13082 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013083 m_commandBuffer->EndRenderPass();
13084 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013085
13086 VkSubmitInfo submit_info = {};
13087 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13088 submit_info.commandBufferCount = 1;
13089 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13090 // Submit cmd buffer and then destroy bufferView while in-flight
13091 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13092
13093 vkDestroyBufferView(m_device->device(), view, nullptr);
13094 m_errorMonitor->VerifyFound();
13095 vkQueueWaitIdle(m_device->m_queue);
13096 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013097 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013098 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013099 vkDestroyBufferView(m_device->device(), view, NULL);
13100 vkDestroyBuffer(m_device->device(), buffer, NULL);
13101 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13102 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13103 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13104 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13105}
13106
Tobin Ehlis209532e2016-09-07 13:52:18 -060013107TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13108 TEST_DESCRIPTION("Delete in-use sampler.");
13109
Tony Barbour1fa09702017-03-16 12:09:08 -060013110 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013111 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13112
13113 VkDescriptorPoolSize ds_type_count;
13114 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13115 ds_type_count.descriptorCount = 1;
13116
13117 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13118 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13119 ds_pool_ci.maxSets = 1;
13120 ds_pool_ci.poolSizeCount = 1;
13121 ds_pool_ci.pPoolSizes = &ds_type_count;
13122
13123 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013124 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013125 ASSERT_VK_SUCCESS(err);
13126
13127 VkSamplerCreateInfo sampler_ci = {};
13128 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13129 sampler_ci.pNext = NULL;
13130 sampler_ci.magFilter = VK_FILTER_NEAREST;
13131 sampler_ci.minFilter = VK_FILTER_NEAREST;
13132 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13133 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13134 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13135 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13136 sampler_ci.mipLodBias = 1.0;
13137 sampler_ci.anisotropyEnable = VK_FALSE;
13138 sampler_ci.maxAnisotropy = 1;
13139 sampler_ci.compareEnable = VK_FALSE;
13140 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13141 sampler_ci.minLod = 1.0;
13142 sampler_ci.maxLod = 1.0;
13143 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13144 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13145 VkSampler sampler;
13146
13147 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13148 ASSERT_VK_SUCCESS(err);
13149
13150 VkDescriptorSetLayoutBinding layout_binding;
13151 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013152 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013153 layout_binding.descriptorCount = 1;
13154 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13155 layout_binding.pImmutableSamplers = NULL;
13156
13157 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13158 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13159 ds_layout_ci.bindingCount = 1;
13160 ds_layout_ci.pBindings = &layout_binding;
13161 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013162 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013163 ASSERT_VK_SUCCESS(err);
13164
13165 VkDescriptorSetAllocateInfo alloc_info = {};
13166 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13167 alloc_info.descriptorSetCount = 1;
13168 alloc_info.descriptorPool = ds_pool;
13169 alloc_info.pSetLayouts = &ds_layout;
13170 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013171 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013172 ASSERT_VK_SUCCESS(err);
13173
13174 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13175 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13176 pipeline_layout_ci.pNext = NULL;
13177 pipeline_layout_ci.setLayoutCount = 1;
13178 pipeline_layout_ci.pSetLayouts = &ds_layout;
13179
13180 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013181 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013182 ASSERT_VK_SUCCESS(err);
13183
13184 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013185 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 -060013186 ASSERT_TRUE(image.initialized());
13187
13188 VkImageView view;
13189 VkImageViewCreateInfo ivci = {};
13190 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13191 ivci.image = image.handle();
13192 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13193 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13194 ivci.subresourceRange.layerCount = 1;
13195 ivci.subresourceRange.baseMipLevel = 0;
13196 ivci.subresourceRange.levelCount = 1;
13197 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13198
13199 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13200 ASSERT_VK_SUCCESS(err);
13201
13202 VkDescriptorImageInfo image_info{};
13203 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13204 image_info.imageView = view;
13205 image_info.sampler = sampler;
13206
13207 VkWriteDescriptorSet descriptor_write = {};
13208 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13209 descriptor_write.dstSet = descriptor_set;
13210 descriptor_write.dstBinding = 0;
13211 descriptor_write.descriptorCount = 1;
13212 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13213 descriptor_write.pImageInfo = &image_info;
13214
13215 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13216
13217 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013218 char const *vsSource =
13219 "#version 450\n"
13220 "\n"
13221 "out gl_PerVertex { \n"
13222 " vec4 gl_Position;\n"
13223 "};\n"
13224 "void main(){\n"
13225 " gl_Position = vec4(1);\n"
13226 "}\n";
13227 char const *fsSource =
13228 "#version 450\n"
13229 "\n"
13230 "layout(set=0, binding=0) uniform sampler2D s;\n"
13231 "layout(location=0) out vec4 x;\n"
13232 "void main(){\n"
13233 " x = texture(s, vec2(1));\n"
13234 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013235 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13236 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13237 VkPipelineObj pipe(m_device);
13238 pipe.AddShader(&vs);
13239 pipe.AddShader(&fs);
13240 pipe.AddColorAttachment();
13241 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13242
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013244
Tony Barbour552f6c02016-12-21 14:34:07 -070013245 m_commandBuffer->BeginCommandBuffer();
13246 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013247 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013248 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13249 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13250 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013251
13252 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13253 VkRect2D scissor = {{0, 0}, {16, 16}};
13254 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13255 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13256
Tobin Ehlis209532e2016-09-07 13:52:18 -060013257 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013258 m_commandBuffer->EndRenderPass();
13259 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013260 // Submit cmd buffer then destroy sampler
13261 VkSubmitInfo submit_info = {};
13262 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13263 submit_info.commandBufferCount = 1;
13264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13265 // Submit cmd buffer and then destroy sampler while in-flight
13266 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13267
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013268 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013269 m_errorMonitor->VerifyFound();
13270 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013271
Tobin Ehlis209532e2016-09-07 13:52:18 -060013272 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013273 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13274 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013275 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013276 vkDestroyImageView(m_device->device(), view, NULL);
13277 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13278 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13279 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13280}
13281
Mark Mueller1cd9f412016-08-25 13:23:52 -060013282TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013283 TEST_DESCRIPTION(
13284 "Call VkQueueSubmit with a semaphore that is already "
13285 "signaled but not waited on by the queue. Wait on a "
13286 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013287
Tony Barbour1fa09702017-03-16 12:09:08 -060013288 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013289 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13290
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013291 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 -070013292 const char *invalid_fence_wait_message =
13293 " which has not been submitted on a Queue or during "
13294 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013295
Tony Barbour552f6c02016-12-21 14:34:07 -070013296 m_commandBuffer->BeginCommandBuffer();
13297 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013298
13299 VkSemaphoreCreateInfo semaphore_create_info = {};
13300 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13301 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013302 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013303 VkSubmitInfo submit_info = {};
13304 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13305 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013306 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013307 submit_info.signalSemaphoreCount = 1;
13308 submit_info.pSignalSemaphores = &semaphore;
13309 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013310 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013311 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013312 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013313 m_commandBuffer->BeginCommandBuffer();
13314 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013315 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013316 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13317 m_errorMonitor->VerifyFound();
13318
Mark Mueller1cd9f412016-08-25 13:23:52 -060013319 VkFenceCreateInfo fence_create_info = {};
13320 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13321 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013322 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013323
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013325 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13326 m_errorMonitor->VerifyFound();
13327
Mark Mueller4042b652016-09-05 22:52:21 -060013328 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013329 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013330 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13331}
13332
Tobin Ehlis4af23302016-07-19 10:50:30 -060013333TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013334 TEST_DESCRIPTION(
13335 "Bind a secondary command buffer with with a framebuffer "
13336 "that does not match the framebuffer for the active "
13337 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013338 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013339 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13340
13341 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013342 VkAttachmentDescription attachment = {0,
13343 VK_FORMAT_B8G8R8A8_UNORM,
13344 VK_SAMPLE_COUNT_1_BIT,
13345 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13346 VK_ATTACHMENT_STORE_OP_STORE,
13347 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13348 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13349 VK_IMAGE_LAYOUT_UNDEFINED,
13350 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013351
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013352 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013353
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013354 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013355
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013356 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013357
13358 VkRenderPass rp;
13359 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13360 ASSERT_VK_SUCCESS(err);
13361
13362 // A compatible framebuffer.
13363 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013364 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 -060013365 ASSERT_TRUE(image.initialized());
13366
13367 VkImageViewCreateInfo ivci = {
13368 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13369 nullptr,
13370 0,
13371 image.handle(),
13372 VK_IMAGE_VIEW_TYPE_2D,
13373 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013374 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13375 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013376 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13377 };
13378 VkImageView view;
13379 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13380 ASSERT_VK_SUCCESS(err);
13381
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013382 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013383 VkFramebuffer fb;
13384 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13385 ASSERT_VK_SUCCESS(err);
13386
13387 VkCommandBufferAllocateInfo cbai = {};
13388 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013389 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013390 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13391 cbai.commandBufferCount = 1;
13392
13393 VkCommandBuffer sec_cb;
13394 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13395 ASSERT_VK_SUCCESS(err);
13396 VkCommandBufferBeginInfo cbbi = {};
13397 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013398 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013399 cbii.renderPass = renderPass();
13400 cbii.framebuffer = fb;
13401 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13402 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013403 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 -060013404 cbbi.pInheritanceInfo = &cbii;
13405 vkBeginCommandBuffer(sec_cb, &cbbi);
13406 vkEndCommandBuffer(sec_cb);
13407
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013408 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013409 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13410 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013411
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013413 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013414 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13415 m_errorMonitor->VerifyFound();
13416 // Cleanup
13417 vkDestroyImageView(m_device->device(), view, NULL);
13418 vkDestroyRenderPass(m_device->device(), rp, NULL);
13419 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13420}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013421
13422TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013423 TEST_DESCRIPTION(
13424 "If logicOp is available on the device, set it to an "
13425 "invalid value. If logicOp is not available, attempt to "
13426 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013427 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13429
13430 auto features = m_device->phy().features();
13431 // Set the expected error depending on whether or not logicOp available
13432 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13434 "If logic operations feature not "
13435 "enabled, logicOpEnable must be "
13436 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013437 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013439 }
13440 // Create a pipeline using logicOp
13441 VkResult err;
13442
13443 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13444 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13445
13446 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013447 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013448 ASSERT_VK_SUCCESS(err);
13449
13450 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13451 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13452 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013453 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013454 vp_state_ci.pViewports = &vp;
13455 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013456 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013457 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013458
13459 VkPipelineShaderStageCreateInfo shaderStages[2];
13460 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13461
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013462 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13463 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013464 shaderStages[0] = vs.GetStageCreateInfo();
13465 shaderStages[1] = fs.GetStageCreateInfo();
13466
13467 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13468 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13469
13470 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13471 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13472 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13473
13474 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13475 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013476 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013477
13478 VkPipelineColorBlendAttachmentState att = {};
13479 att.blendEnable = VK_FALSE;
13480 att.colorWriteMask = 0xf;
13481
13482 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13483 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13484 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13485 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013486 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013487 cb_ci.attachmentCount = 1;
13488 cb_ci.pAttachments = &att;
13489
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013490 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13491 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13492 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13493
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013494 VkGraphicsPipelineCreateInfo gp_ci = {};
13495 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13496 gp_ci.stageCount = 2;
13497 gp_ci.pStages = shaderStages;
13498 gp_ci.pVertexInputState = &vi_ci;
13499 gp_ci.pInputAssemblyState = &ia_ci;
13500 gp_ci.pViewportState = &vp_state_ci;
13501 gp_ci.pRasterizationState = &rs_ci;
13502 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013503 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013504 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13505 gp_ci.layout = pipeline_layout;
13506 gp_ci.renderPass = renderPass();
13507
13508 VkPipelineCacheCreateInfo pc_ci = {};
13509 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13510
13511 VkPipeline pipeline;
13512 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013513 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013514 ASSERT_VK_SUCCESS(err);
13515
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013516 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013517 m_errorMonitor->VerifyFound();
13518 if (VK_SUCCESS == err) {
13519 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13520 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013521 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13522 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13523}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013524
Mike Stroyanaccf7692015-05-12 16:00:45 -060013525#if GTEST_IS_THREADSAFE
13526struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013527 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013528 VkEvent event;
13529 bool bailout;
13530};
13531
Karl Schultz6addd812016-02-02 17:17:23 -070013532extern "C" void *AddToCommandBuffer(void *arg) {
13533 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013534
Mike Stroyana6d14942016-07-13 15:10:05 -060013535 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013536 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013537 if (data->bailout) {
13538 break;
13539 }
13540 }
13541 return NULL;
13542}
13543
Karl Schultz6addd812016-02-02 17:17:23 -070013544TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013545 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013546
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013548
Tony Barbour1fa09702017-03-16 12:09:08 -060013549 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013550 ASSERT_NO_FATAL_FAILURE(InitViewport());
13551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13552
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013553 // Calls AllocateCommandBuffers
13554 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013555
13556 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013557 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013558
13559 VkEventCreateInfo event_info;
13560 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013561 VkResult err;
13562
13563 memset(&event_info, 0, sizeof(event_info));
13564 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13565
Chia-I Wuf7458c52015-10-26 21:10:41 +080013566 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013567 ASSERT_VK_SUCCESS(err);
13568
Mike Stroyanaccf7692015-05-12 16:00:45 -060013569 err = vkResetEvent(device(), event);
13570 ASSERT_VK_SUCCESS(err);
13571
13572 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013573 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013574 data.event = event;
13575 data.bailout = false;
13576 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013577
13578 // First do some correct operations using multiple threads.
13579 // Add many entries to command buffer from another thread.
13580 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13581 // Make non-conflicting calls from this thread at the same time.
13582 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013583 uint32_t count;
13584 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013585 }
13586 test_platform_thread_join(thread, NULL);
13587
13588 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013589 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013590 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013591 // Add many entries to command buffer from this thread at the same time.
13592 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013593
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013594 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013595 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013596
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013597 m_errorMonitor->SetBailout(NULL);
13598
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013599 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013600
Chia-I Wuf7458c52015-10-26 21:10:41 +080013601 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013602}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013603#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013604
Karl Schultz6addd812016-02-02 17:17:23 -070013605TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013606 TEST_DESCRIPTION(
13607 "Test that an error is produced for a spirv module "
13608 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013609
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013611
Tony Barbour1fa09702017-03-16 12:09:08 -060013612 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013613 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13614
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013615 VkShaderModule module;
13616 VkShaderModuleCreateInfo moduleCreateInfo;
13617 struct icd_spv_header spv;
13618
13619 spv.magic = ICD_SPV_MAGIC;
13620 spv.version = ICD_SPV_VERSION;
13621 spv.gen_magic = 0;
13622
13623 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13624 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013625 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013626 moduleCreateInfo.codeSize = 4;
13627 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013628 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013629
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013630 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013631}
13632
Karl Schultz6addd812016-02-02 17:17:23 -070013633TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013634 TEST_DESCRIPTION(
13635 "Test that an error is produced for a spirv module "
13636 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013637
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013639
Tony Barbour1fa09702017-03-16 12:09:08 -060013640 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013641 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13642
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013643 VkShaderModule module;
13644 VkShaderModuleCreateInfo moduleCreateInfo;
13645 struct icd_spv_header spv;
13646
13647 spv.magic = ~ICD_SPV_MAGIC;
13648 spv.version = ICD_SPV_VERSION;
13649 spv.gen_magic = 0;
13650
13651 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13652 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013653 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013654 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13655 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013656 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013657
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013658 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013659}
13660
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013661#if 0
13662// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013663TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013665 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013666
Tony Barbour1fa09702017-03-16 12:09:08 -060013667 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13669
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013670 VkShaderModule module;
13671 VkShaderModuleCreateInfo moduleCreateInfo;
13672 struct icd_spv_header spv;
13673
13674 spv.magic = ICD_SPV_MAGIC;
13675 spv.version = ~ICD_SPV_VERSION;
13676 spv.gen_magic = 0;
13677
13678 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13679 moduleCreateInfo.pNext = NULL;
13680
Karl Schultz6addd812016-02-02 17:17:23 -070013681 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013682 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13683 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013684 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013685
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013686 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013687}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013688#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013689
Karl Schultz6addd812016-02-02 17:17:23 -070013690TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013691 TEST_DESCRIPTION(
13692 "Test that a warning is produced for a vertex output that "
13693 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013695
Tony Barbour1fa09702017-03-16 12:09:08 -060013696 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013698
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013699 char const *vsSource =
13700 "#version 450\n"
13701 "\n"
13702 "layout(location=0) out float x;\n"
13703 "out gl_PerVertex {\n"
13704 " vec4 gl_Position;\n"
13705 "};\n"
13706 "void main(){\n"
13707 " gl_Position = vec4(1);\n"
13708 " x = 0;\n"
13709 "}\n";
13710 char const *fsSource =
13711 "#version 450\n"
13712 "\n"
13713 "layout(location=0) out vec4 color;\n"
13714 "void main(){\n"
13715 " color = vec4(1);\n"
13716 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013717
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013718 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13719 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013720
13721 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013722 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013723 pipe.AddShader(&vs);
13724 pipe.AddShader(&fs);
13725
Chris Forbes9f7ff632015-05-25 11:13:08 +120013726 VkDescriptorSetObj descriptorSet(m_device);
13727 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013728 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013729
Tony Barbour5781e8f2015-08-04 16:23:11 -060013730 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013731
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013732 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013733}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013734
Mark Mueller098c9cb2016-09-08 09:01:57 -060013735TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13736 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13737
Tony Barbour1fa09702017-03-16 12:09:08 -060013738 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013739 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13740
13741 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013742 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013743
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013744 char const *vsSource =
13745 "#version 450\n"
13746 "\n"
13747 "out gl_PerVertex {\n"
13748 " vec4 gl_Position;\n"
13749 "};\n"
13750 "void main(){\n"
13751 " gl_Position = vec4(1);\n"
13752 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013753
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013754 char const *fsSource =
13755 "#version 450\n"
13756 "\n"
13757 "layout (constant_id = 0) const float r = 0.0f;\n"
13758 "layout(location = 0) out vec4 uFragColor;\n"
13759 "void main(){\n"
13760 " uFragColor = vec4(r,1,0,1);\n"
13761 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013762
13763 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13764 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13765
13766 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13767 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13768
13769 VkPipelineLayout pipeline_layout;
13770 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13771
13772 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13773 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13774 vp_state_create_info.viewportCount = 1;
13775 VkViewport viewport = {};
13776 vp_state_create_info.pViewports = &viewport;
13777 vp_state_create_info.scissorCount = 1;
13778 VkRect2D scissors = {};
13779 vp_state_create_info.pScissors = &scissors;
13780
13781 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13782
13783 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13784 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13785 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13786 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13787
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013788 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013789
13790 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13791 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13792
13793 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13794 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13795 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13796
13797 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13798 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13799 rasterization_state_create_info.pNext = nullptr;
13800 rasterization_state_create_info.lineWidth = 1.0f;
13801 rasterization_state_create_info.rasterizerDiscardEnable = true;
13802
13803 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13804 color_blend_attachment_state.blendEnable = VK_FALSE;
13805 color_blend_attachment_state.colorWriteMask = 0xf;
13806
13807 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13808 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13809 color_blend_state_create_info.attachmentCount = 1;
13810 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13811
13812 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13813 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13814 graphicspipe_create_info.stageCount = 2;
13815 graphicspipe_create_info.pStages = shader_stage_create_info;
13816 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13817 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13818 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13819 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13820 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13821 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13822 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13823 graphicspipe_create_info.layout = pipeline_layout;
13824 graphicspipe_create_info.renderPass = renderPass();
13825
13826 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13827 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13828
13829 VkPipelineCache pipelineCache;
13830 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13831
13832 // This structure maps constant ids to data locations.
13833 const VkSpecializationMapEntry entry =
13834 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013835 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013836
13837 uint32_t data = 1;
13838
13839 // Set up the info describing spec map and data
13840 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013841 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013842 };
13843 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13844
13845 VkPipeline pipeline;
13846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13847 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13848 m_errorMonitor->VerifyFound();
13849
13850 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13851 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13852}
13853
13854TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13855 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13856
Tony Barbour1fa09702017-03-16 12:09:08 -060013857 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013858 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13859
13860 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13861
13862 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13863 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13864 descriptor_pool_type_count[0].descriptorCount = 1;
13865 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13866 descriptor_pool_type_count[1].descriptorCount = 1;
13867
13868 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13869 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13870 descriptor_pool_create_info.maxSets = 1;
13871 descriptor_pool_create_info.poolSizeCount = 2;
13872 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13873 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13874
13875 VkDescriptorPool descriptorset_pool;
13876 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13877
13878 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13879 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13880 descriptorset_layout_binding.descriptorCount = 1;
13881 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013882 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013883
13884 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13885 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13886 descriptorset_layout_create_info.bindingCount = 1;
13887 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13888
13889 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013890 ASSERT_VK_SUCCESS(
13891 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013892
13893 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13894 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13895 descriptorset_allocate_info.descriptorSetCount = 1;
13896 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13897 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13898 VkDescriptorSet descriptorset;
13899 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13900
13901 // Challenge core_validation with a non uniform buffer type.
13902 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13903
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013904 char const *vsSource =
13905 "#version 450\n"
13906 "\n"
13907 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13908 " mat4 mvp;\n"
13909 "} ubuf;\n"
13910 "out gl_PerVertex {\n"
13911 " vec4 gl_Position;\n"
13912 "};\n"
13913 "void main(){\n"
13914 " gl_Position = ubuf.mvp * vec4(1);\n"
13915 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013916
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013917 char const *fsSource =
13918 "#version 450\n"
13919 "\n"
13920 "layout(location = 0) out vec4 uFragColor;\n"
13921 "void main(){\n"
13922 " uFragColor = vec4(0,1,0,1);\n"
13923 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013924
13925 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13926 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13927
13928 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13929 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13930 pipeline_layout_create_info.setLayoutCount = 1;
13931 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13932
13933 VkPipelineLayout pipeline_layout;
13934 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13935
13936 VkPipelineObj pipe(m_device);
13937 pipe.AddColorAttachment();
13938 pipe.AddShader(&vs);
13939 pipe.AddShader(&fs);
13940
13941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13942 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13943 m_errorMonitor->VerifyFound();
13944
13945 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13946 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13947 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13948}
13949
13950TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13951 TEST_DESCRIPTION(
13952 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13953
Tony Barbour1fa09702017-03-16 12:09:08 -060013954 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013955 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13956
13957 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13958
13959 VkDescriptorPoolSize descriptor_pool_type_count = {};
13960 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13961 descriptor_pool_type_count.descriptorCount = 1;
13962
13963 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13964 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13965 descriptor_pool_create_info.maxSets = 1;
13966 descriptor_pool_create_info.poolSizeCount = 1;
13967 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13968 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13969
13970 VkDescriptorPool descriptorset_pool;
13971 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13972
13973 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13974 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13975 descriptorset_layout_binding.descriptorCount = 1;
13976 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13977 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013978 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013979
13980 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13981 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13982 descriptorset_layout_create_info.bindingCount = 1;
13983 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13984
13985 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013986 ASSERT_VK_SUCCESS(
13987 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013988
13989 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13990 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13991 descriptorset_allocate_info.descriptorSetCount = 1;
13992 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13993 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13994 VkDescriptorSet descriptorset;
13995 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13996
13997 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013999 char const *vsSource =
14000 "#version 450\n"
14001 "\n"
14002 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14003 " mat4 mvp;\n"
14004 "} ubuf;\n"
14005 "out gl_PerVertex {\n"
14006 " vec4 gl_Position;\n"
14007 "};\n"
14008 "void main(){\n"
14009 " gl_Position = ubuf.mvp * vec4(1);\n"
14010 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014011
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014012 char const *fsSource =
14013 "#version 450\n"
14014 "\n"
14015 "layout(location = 0) out vec4 uFragColor;\n"
14016 "void main(){\n"
14017 " uFragColor = vec4(0,1,0,1);\n"
14018 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014019
14020 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14021 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14022
14023 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14024 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14025 pipeline_layout_create_info.setLayoutCount = 1;
14026 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14027
14028 VkPipelineLayout pipeline_layout;
14029 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14030
14031 VkPipelineObj pipe(m_device);
14032 pipe.AddColorAttachment();
14033 pipe.AddShader(&vs);
14034 pipe.AddShader(&fs);
14035
14036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14037 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14038 m_errorMonitor->VerifyFound();
14039
14040 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14041 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14042 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14043}
14044
14045TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014046 TEST_DESCRIPTION(
14047 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14048 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014049
Tony Barbour1fa09702017-03-16 12:09:08 -060014050 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014051 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14052
14053 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014054 "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 -060014055
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014056 char const *vsSource =
14057 "#version 450\n"
14058 "\n"
14059 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14060 "out gl_PerVertex {\n"
14061 " vec4 gl_Position;\n"
14062 "};\n"
14063 "void main(){\n"
14064 " gl_Position = vec4(consts.x);\n"
14065 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014066
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014067 char const *fsSource =
14068 "#version 450\n"
14069 "\n"
14070 "layout(location = 0) out vec4 uFragColor;\n"
14071 "void main(){\n"
14072 " uFragColor = vec4(0,1,0,1);\n"
14073 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014074
14075 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14076 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14077
14078 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14079 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14080
14081 // Set up a push constant range
14082 VkPushConstantRange push_constant_ranges = {};
14083 // Set to the wrong stage to challenge core_validation
14084 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14085 push_constant_ranges.size = 4;
14086
14087 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14088 pipeline_layout_create_info.pushConstantRangeCount = 1;
14089
14090 VkPipelineLayout pipeline_layout;
14091 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14092
14093 VkPipelineObj pipe(m_device);
14094 pipe.AddColorAttachment();
14095 pipe.AddShader(&vs);
14096 pipe.AddShader(&fs);
14097
14098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14099 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14100 m_errorMonitor->VerifyFound();
14101
14102 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14103}
14104
14105TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14106 TEST_DESCRIPTION(
14107 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14108
Tony Barbour1fa09702017-03-16 12:09:08 -060014109 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14111
14112 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014113 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014114
14115 // Some awkward steps are required to test with custom device features.
14116 std::vector<const char *> device_extension_names;
14117 auto features = m_device->phy().features();
14118 // Disable support for 64 bit floats
14119 features.shaderFloat64 = false;
14120 // The sacrificial device object
14121 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14122
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014123 char const *vsSource =
14124 "#version 450\n"
14125 "\n"
14126 "out gl_PerVertex {\n"
14127 " vec4 gl_Position;\n"
14128 "};\n"
14129 "void main(){\n"
14130 " gl_Position = vec4(1);\n"
14131 "}\n";
14132 char const *fsSource =
14133 "#version 450\n"
14134 "\n"
14135 "layout(location=0) out vec4 color;\n"
14136 "void main(){\n"
14137 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14138 " color = vec4(green);\n"
14139 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014140
14141 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14142 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14143
14144 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014145
14146 VkPipelineObj pipe(&test_device);
14147 pipe.AddColorAttachment();
14148 pipe.AddShader(&vs);
14149 pipe.AddShader(&fs);
14150
14151 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14152 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14153 VkPipelineLayout pipeline_layout;
14154 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14155
14156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14157 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14158 m_errorMonitor->VerifyFound();
14159
14160 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14161}
14162
Mark Lobodzinski20832822017-03-24 14:49:45 -060014163TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14164 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14165 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014166
Tony Barbour1fa09702017-03-16 12:09:08 -060014167 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14169
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014170 char const *vsSource =
14171 "#version 450\n"
14172 "\n"
14173 "out gl_PerVertex {\n"
14174 " vec4 gl_Position;\n"
14175 "};\n"
14176 "layout(xfb_buffer = 1) out;"
14177 "void main(){\n"
14178 " gl_Position = vec4(1);\n"
14179 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014180
Mark Lobodzinski20832822017-03-24 14:49:45 -060014181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014182
Mark Lobodzinski20832822017-03-24 14:49:45 -060014183 std::vector<unsigned int> spv;
14184 VkShaderModuleCreateInfo module_create_info;
14185 VkShaderModule shader_module;
14186 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14187 module_create_info.pNext = NULL;
14188 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14189 module_create_info.pCode = spv.data();
14190 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14191 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014192
Mark Lobodzinski20832822017-03-24 14:49:45 -060014193 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014194
Mark Lobodzinski20832822017-03-24 14:49:45 -060014195 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014196}
14197
Karl Schultz6addd812016-02-02 17:17:23 -070014198TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014199 TEST_DESCRIPTION(
14200 "Test that an error is produced for a fragment shader input "
14201 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014202
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014204
Tony Barbour1fa09702017-03-16 12:09:08 -060014205 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014206 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014207
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014208 char const *vsSource =
14209 "#version 450\n"
14210 "\n"
14211 "out gl_PerVertex {\n"
14212 " vec4 gl_Position;\n"
14213 "};\n"
14214 "void main(){\n"
14215 " gl_Position = vec4(1);\n"
14216 "}\n";
14217 char const *fsSource =
14218 "#version 450\n"
14219 "\n"
14220 "layout(location=0) in float x;\n"
14221 "layout(location=0) out vec4 color;\n"
14222 "void main(){\n"
14223 " color = vec4(x);\n"
14224 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014225
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014226 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14227 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014228
14229 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014230 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014231 pipe.AddShader(&vs);
14232 pipe.AddShader(&fs);
14233
Chris Forbes59cb88d2015-05-25 11:13:13 +120014234 VkDescriptorSetObj descriptorSet(m_device);
14235 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014236 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014237
Tony Barbour5781e8f2015-08-04 16:23:11 -060014238 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014239
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014240 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014241}
14242
Karl Schultz6addd812016-02-02 17:17:23 -070014243TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014244 TEST_DESCRIPTION(
14245 "Test that an error is produced for a fragment shader input "
14246 "within an interace block, which is not present in the outputs "
14247 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014249
Tony Barbour1fa09702017-03-16 12:09:08 -060014250 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014251 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14252
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014253 char const *vsSource =
14254 "#version 450\n"
14255 "\n"
14256 "out gl_PerVertex {\n"
14257 " vec4 gl_Position;\n"
14258 "};\n"
14259 "void main(){\n"
14260 " gl_Position = vec4(1);\n"
14261 "}\n";
14262 char const *fsSource =
14263 "#version 450\n"
14264 "\n"
14265 "in block { layout(location=0) float x; } ins;\n"
14266 "layout(location=0) out vec4 color;\n"
14267 "void main(){\n"
14268 " color = vec4(ins.x);\n"
14269 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014270
14271 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14272 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14273
14274 VkPipelineObj pipe(m_device);
14275 pipe.AddColorAttachment();
14276 pipe.AddShader(&vs);
14277 pipe.AddShader(&fs);
14278
14279 VkDescriptorSetObj descriptorSet(m_device);
14280 descriptorSet.AppendDummy();
14281 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14282
14283 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14284
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014285 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014286}
14287
Karl Schultz6addd812016-02-02 17:17:23 -070014288TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014289 TEST_DESCRIPTION(
14290 "Test that an error is produced for mismatched array sizes "
14291 "across the vertex->fragment shader interface");
14292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14293 "Type mismatch on location 0.0: 'ptr to "
14294 "output arr[2] of float32' vs 'ptr to "
14295 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014296
Tony Barbour1fa09702017-03-16 12:09:08 -060014297 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014298 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14299
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014300 char const *vsSource =
14301 "#version 450\n"
14302 "\n"
14303 "layout(location=0) out float x[2];\n"
14304 "out gl_PerVertex {\n"
14305 " vec4 gl_Position;\n"
14306 "};\n"
14307 "void main(){\n"
14308 " x[0] = 0; x[1] = 0;\n"
14309 " gl_Position = vec4(1);\n"
14310 "}\n";
14311 char const *fsSource =
14312 "#version 450\n"
14313 "\n"
14314 "layout(location=0) in float x[1];\n"
14315 "layout(location=0) out vec4 color;\n"
14316 "void main(){\n"
14317 " color = vec4(x[0]);\n"
14318 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014319
14320 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14321 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14322
14323 VkPipelineObj pipe(m_device);
14324 pipe.AddColorAttachment();
14325 pipe.AddShader(&vs);
14326 pipe.AddShader(&fs);
14327
14328 VkDescriptorSetObj descriptorSet(m_device);
14329 descriptorSet.AppendDummy();
14330 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14331
14332 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14333
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014334 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014335}
14336
Karl Schultz6addd812016-02-02 17:17:23 -070014337TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014338 TEST_DESCRIPTION(
14339 "Test that an error is produced for mismatched types across "
14340 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014342
Tony Barbour1fa09702017-03-16 12:09:08 -060014343 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014344 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014345
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014346 char const *vsSource =
14347 "#version 450\n"
14348 "\n"
14349 "layout(location=0) out int x;\n"
14350 "out gl_PerVertex {\n"
14351 " vec4 gl_Position;\n"
14352 "};\n"
14353 "void main(){\n"
14354 " x = 0;\n"
14355 " gl_Position = vec4(1);\n"
14356 "}\n";
14357 char const *fsSource =
14358 "#version 450\n"
14359 "\n"
14360 "layout(location=0) in float x;\n" /* VS writes int */
14361 "layout(location=0) out vec4 color;\n"
14362 "void main(){\n"
14363 " color = vec4(x);\n"
14364 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014365
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014366 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14367 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014368
14369 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014370 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014371 pipe.AddShader(&vs);
14372 pipe.AddShader(&fs);
14373
Chris Forbesb56af562015-05-25 11:13:17 +120014374 VkDescriptorSetObj descriptorSet(m_device);
14375 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014376 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014377
Tony Barbour5781e8f2015-08-04 16:23:11 -060014378 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014379
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014380 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014381}
14382
Karl Schultz6addd812016-02-02 17:17:23 -070014383TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014384 TEST_DESCRIPTION(
14385 "Test that an error is produced for mismatched types across "
14386 "the vertex->fragment shader interface, when the variable is contained within "
14387 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014389
Tony Barbour1fa09702017-03-16 12:09:08 -060014390 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14392
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014393 char const *vsSource =
14394 "#version 450\n"
14395 "\n"
14396 "out block { layout(location=0) int x; } outs;\n"
14397 "out gl_PerVertex {\n"
14398 " vec4 gl_Position;\n"
14399 "};\n"
14400 "void main(){\n"
14401 " outs.x = 0;\n"
14402 " gl_Position = vec4(1);\n"
14403 "}\n";
14404 char const *fsSource =
14405 "#version 450\n"
14406 "\n"
14407 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14408 "layout(location=0) out vec4 color;\n"
14409 "void main(){\n"
14410 " color = vec4(ins.x);\n"
14411 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014412
14413 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14414 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14415
14416 VkPipelineObj pipe(m_device);
14417 pipe.AddColorAttachment();
14418 pipe.AddShader(&vs);
14419 pipe.AddShader(&fs);
14420
14421 VkDescriptorSetObj descriptorSet(m_device);
14422 descriptorSet.AppendDummy();
14423 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14424
14425 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14426
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014427 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014428}
14429
14430TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014431 TEST_DESCRIPTION(
14432 "Test that an error is produced for location mismatches across "
14433 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14434 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014435 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 +130014436
Tony Barbour1fa09702017-03-16 12:09:08 -060014437 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14439
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014440 char const *vsSource =
14441 "#version 450\n"
14442 "\n"
14443 "out block { layout(location=1) float x; } outs;\n"
14444 "out gl_PerVertex {\n"
14445 " vec4 gl_Position;\n"
14446 "};\n"
14447 "void main(){\n"
14448 " outs.x = 0;\n"
14449 " gl_Position = vec4(1);\n"
14450 "}\n";
14451 char const *fsSource =
14452 "#version 450\n"
14453 "\n"
14454 "in block { layout(location=0) float x; } ins;\n"
14455 "layout(location=0) out vec4 color;\n"
14456 "void main(){\n"
14457 " color = vec4(ins.x);\n"
14458 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014459
14460 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14461 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14462
14463 VkPipelineObj pipe(m_device);
14464 pipe.AddColorAttachment();
14465 pipe.AddShader(&vs);
14466 pipe.AddShader(&fs);
14467
14468 VkDescriptorSetObj descriptorSet(m_device);
14469 descriptorSet.AppendDummy();
14470 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14471
14472 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14473
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014474 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014475}
14476
14477TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014478 TEST_DESCRIPTION(
14479 "Test that an error is produced for component mismatches across the "
14480 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14481 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014482 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 +130014483
Tony Barbour1fa09702017-03-16 12:09:08 -060014484 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14486
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014487 char const *vsSource =
14488 "#version 450\n"
14489 "\n"
14490 "out block { layout(location=0, component=0) float x; } outs;\n"
14491 "out gl_PerVertex {\n"
14492 " vec4 gl_Position;\n"
14493 "};\n"
14494 "void main(){\n"
14495 " outs.x = 0;\n"
14496 " gl_Position = vec4(1);\n"
14497 "}\n";
14498 char const *fsSource =
14499 "#version 450\n"
14500 "\n"
14501 "in block { layout(location=0, component=1) float x; } ins;\n"
14502 "layout(location=0) out vec4 color;\n"
14503 "void main(){\n"
14504 " color = vec4(ins.x);\n"
14505 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014506
14507 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14508 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14509
14510 VkPipelineObj pipe(m_device);
14511 pipe.AddColorAttachment();
14512 pipe.AddShader(&vs);
14513 pipe.AddShader(&fs);
14514
14515 VkDescriptorSetObj descriptorSet(m_device);
14516 descriptorSet.AppendDummy();
14517 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14518
14519 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14520
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014521 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014522}
14523
Chris Forbes1f3b0152016-11-30 12:48:40 +130014524TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14525 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14526
Tony Barbour1fa09702017-03-16 12:09:08 -060014527 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14529
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014530 char const *vsSource =
14531 "#version 450\n"
14532 "layout(location=0) out mediump float x;\n"
14533 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14534 char const *fsSource =
14535 "#version 450\n"
14536 "layout(location=0) in highp float x;\n"
14537 "layout(location=0) out vec4 color;\n"
14538 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014539
14540 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14541 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14542
14543 VkPipelineObj pipe(m_device);
14544 pipe.AddColorAttachment();
14545 pipe.AddShader(&vs);
14546 pipe.AddShader(&fs);
14547
14548 VkDescriptorSetObj descriptorSet(m_device);
14549 descriptorSet.AppendDummy();
14550 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14551
14552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14553
14554 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14555
14556 m_errorMonitor->VerifyFound();
14557}
14558
Chris Forbes870a39e2016-11-30 12:55:56 +130014559TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14560 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14561
Tony Barbour1fa09702017-03-16 12:09:08 -060014562 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014563 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14564
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014565 char const *vsSource =
14566 "#version 450\n"
14567 "out block { layout(location=0) mediump float x; };\n"
14568 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14569 char const *fsSource =
14570 "#version 450\n"
14571 "in block { layout(location=0) highp float x; };\n"
14572 "layout(location=0) out vec4 color;\n"
14573 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014574
14575 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14576 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14577
14578 VkPipelineObj pipe(m_device);
14579 pipe.AddColorAttachment();
14580 pipe.AddShader(&vs);
14581 pipe.AddShader(&fs);
14582
14583 VkDescriptorSetObj descriptorSet(m_device);
14584 descriptorSet.AppendDummy();
14585 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14586
14587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14588
14589 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14590
14591 m_errorMonitor->VerifyFound();
14592}
14593
Karl Schultz6addd812016-02-02 17:17:23 -070014594TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014595 TEST_DESCRIPTION(
14596 "Test that a warning is produced for a vertex attribute which is "
14597 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014599
Tony Barbour1fa09702017-03-16 12:09:08 -060014600 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014601 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014602
14603 VkVertexInputBindingDescription input_binding;
14604 memset(&input_binding, 0, sizeof(input_binding));
14605
14606 VkVertexInputAttributeDescription input_attrib;
14607 memset(&input_attrib, 0, sizeof(input_attrib));
14608 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14609
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014610 char const *vsSource =
14611 "#version 450\n"
14612 "\n"
14613 "out gl_PerVertex {\n"
14614 " vec4 gl_Position;\n"
14615 "};\n"
14616 "void main(){\n"
14617 " gl_Position = vec4(1);\n"
14618 "}\n";
14619 char const *fsSource =
14620 "#version 450\n"
14621 "\n"
14622 "layout(location=0) out vec4 color;\n"
14623 "void main(){\n"
14624 " color = vec4(1);\n"
14625 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014626
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014627 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14628 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014629
14630 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014631 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014632 pipe.AddShader(&vs);
14633 pipe.AddShader(&fs);
14634
14635 pipe.AddVertexInputBindings(&input_binding, 1);
14636 pipe.AddVertexInputAttribs(&input_attrib, 1);
14637
Chris Forbesde136e02015-05-25 11:13:28 +120014638 VkDescriptorSetObj descriptorSet(m_device);
14639 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014640 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014641
Tony Barbour5781e8f2015-08-04 16:23:11 -060014642 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014643
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014644 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014645}
14646
Karl Schultz6addd812016-02-02 17:17:23 -070014647TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014648 TEST_DESCRIPTION(
14649 "Test that a warning is produced for a location mismatch on "
14650 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014652
Tony Barbour1fa09702017-03-16 12:09:08 -060014653 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14655
14656 VkVertexInputBindingDescription input_binding;
14657 memset(&input_binding, 0, sizeof(input_binding));
14658
14659 VkVertexInputAttributeDescription input_attrib;
14660 memset(&input_attrib, 0, sizeof(input_attrib));
14661 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14662
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014663 char const *vsSource =
14664 "#version 450\n"
14665 "\n"
14666 "layout(location=1) in float x;\n"
14667 "out gl_PerVertex {\n"
14668 " vec4 gl_Position;\n"
14669 "};\n"
14670 "void main(){\n"
14671 " gl_Position = vec4(x);\n"
14672 "}\n";
14673 char const *fsSource =
14674 "#version 450\n"
14675 "\n"
14676 "layout(location=0) out vec4 color;\n"
14677 "void main(){\n"
14678 " color = vec4(1);\n"
14679 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014680
14681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14682 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14683
14684 VkPipelineObj pipe(m_device);
14685 pipe.AddColorAttachment();
14686 pipe.AddShader(&vs);
14687 pipe.AddShader(&fs);
14688
14689 pipe.AddVertexInputBindings(&input_binding, 1);
14690 pipe.AddVertexInputAttribs(&input_attrib, 1);
14691
14692 VkDescriptorSetObj descriptorSet(m_device);
14693 descriptorSet.AppendDummy();
14694 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14695
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014696 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014697 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14698
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014699 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014700}
14701
Karl Schultz6addd812016-02-02 17:17:23 -070014702TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014703 TEST_DESCRIPTION(
14704 "Test that an error is produced for a vertex shader input which is not "
14705 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14707 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014708
Tony Barbour1fa09702017-03-16 12:09:08 -060014709 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014710 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014711
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014712 char const *vsSource =
14713 "#version 450\n"
14714 "\n"
14715 "layout(location=0) in vec4 x;\n" /* not provided */
14716 "out gl_PerVertex {\n"
14717 " vec4 gl_Position;\n"
14718 "};\n"
14719 "void main(){\n"
14720 " gl_Position = x;\n"
14721 "}\n";
14722 char const *fsSource =
14723 "#version 450\n"
14724 "\n"
14725 "layout(location=0) out vec4 color;\n"
14726 "void main(){\n"
14727 " color = vec4(1);\n"
14728 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014729
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014730 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14731 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014732
14733 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014734 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014735 pipe.AddShader(&vs);
14736 pipe.AddShader(&fs);
14737
Chris Forbes62e8e502015-05-25 11:13:29 +120014738 VkDescriptorSetObj descriptorSet(m_device);
14739 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014740 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014741
Tony Barbour5781e8f2015-08-04 16:23:11 -060014742 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014743
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014744 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014745}
14746
Karl Schultz6addd812016-02-02 17:17:23 -070014747TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014748 TEST_DESCRIPTION(
14749 "Test that an error is produced for a mismatch between the "
14750 "fundamental type (float/int/uint) of an attribute and the "
14751 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014752 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 -060014753
Tony Barbour1fa09702017-03-16 12:09:08 -060014754 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014755 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014756
14757 VkVertexInputBindingDescription input_binding;
14758 memset(&input_binding, 0, sizeof(input_binding));
14759
14760 VkVertexInputAttributeDescription input_attrib;
14761 memset(&input_attrib, 0, sizeof(input_attrib));
14762 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14763
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014764 char const *vsSource =
14765 "#version 450\n"
14766 "\n"
14767 "layout(location=0) in int x;\n" /* attrib provided float */
14768 "out gl_PerVertex {\n"
14769 " vec4 gl_Position;\n"
14770 "};\n"
14771 "void main(){\n"
14772 " gl_Position = vec4(x);\n"
14773 "}\n";
14774 char const *fsSource =
14775 "#version 450\n"
14776 "\n"
14777 "layout(location=0) out vec4 color;\n"
14778 "void main(){\n"
14779 " color = vec4(1);\n"
14780 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014781
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014782 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14783 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014784
14785 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014786 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014787 pipe.AddShader(&vs);
14788 pipe.AddShader(&fs);
14789
14790 pipe.AddVertexInputBindings(&input_binding, 1);
14791 pipe.AddVertexInputAttribs(&input_attrib, 1);
14792
Chris Forbesc97d98e2015-05-25 11:13:31 +120014793 VkDescriptorSetObj descriptorSet(m_device);
14794 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014795 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014796
Tony Barbour5781e8f2015-08-04 16:23:11 -060014797 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014798
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014799 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014800}
14801
Chris Forbesc68b43c2016-04-06 11:18:47 +120014802TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014803 TEST_DESCRIPTION(
14804 "Test that an error is produced for a pipeline containing multiple "
14805 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14807 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014808
Tony Barbour1fa09702017-03-16 12:09:08 -060014809 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14811
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014812 char const *vsSource =
14813 "#version 450\n"
14814 "\n"
14815 "out gl_PerVertex {\n"
14816 " vec4 gl_Position;\n"
14817 "};\n"
14818 "void main(){\n"
14819 " gl_Position = vec4(1);\n"
14820 "}\n";
14821 char const *fsSource =
14822 "#version 450\n"
14823 "\n"
14824 "layout(location=0) out vec4 color;\n"
14825 "void main(){\n"
14826 " color = vec4(1);\n"
14827 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014828
14829 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14830 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14831
14832 VkPipelineObj pipe(m_device);
14833 pipe.AddColorAttachment();
14834 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014835 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014836 pipe.AddShader(&fs);
14837
14838 VkDescriptorSetObj descriptorSet(m_device);
14839 descriptorSet.AppendDummy();
14840 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14841
14842 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14843
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014844 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014845}
14846
Chris Forbes82ff92a2016-09-09 10:50:24 +120014847TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014849
Tony Barbour1fa09702017-03-16 12:09:08 -060014850 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14852
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014853 char const *vsSource =
14854 "#version 450\n"
14855 "out gl_PerVertex {\n"
14856 " vec4 gl_Position;\n"
14857 "};\n"
14858 "void main(){\n"
14859 " gl_Position = vec4(0);\n"
14860 "}\n";
14861 char const *fsSource =
14862 "#version 450\n"
14863 "\n"
14864 "layout(location=0) out vec4 color;\n"
14865 "void main(){\n"
14866 " color = vec4(1);\n"
14867 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014868
14869 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14870 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14871
14872 VkPipelineObj pipe(m_device);
14873 pipe.AddColorAttachment();
14874 pipe.AddShader(&vs);
14875 pipe.AddShader(&fs);
14876
14877 VkDescriptorSetObj descriptorSet(m_device);
14878 descriptorSet.AppendDummy();
14879 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14880
14881 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14882
14883 m_errorMonitor->VerifyFound();
14884}
14885
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014886TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14888 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14889 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014890
Tony Barbour1fa09702017-03-16 12:09:08 -060014891 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14893
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014894 char const *vsSource =
14895 "#version 450\n"
14896 "void main(){ gl_Position = vec4(0); }\n";
14897 char const *fsSource =
14898 "#version 450\n"
14899 "\n"
14900 "layout(location=0) out vec4 color;\n"
14901 "void main(){\n"
14902 " color = vec4(1);\n"
14903 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014904
14905 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14906 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14907
14908 VkPipelineObj pipe(m_device);
14909 pipe.AddColorAttachment();
14910 pipe.AddShader(&vs);
14911 pipe.AddShader(&fs);
14912
14913 VkDescriptorSetObj descriptorSet(m_device);
14914 descriptorSet.AppendDummy();
14915 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14916
14917 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014918 {
14919 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14920 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14921 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014922 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014923 {
14924 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14925 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14926 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014927 },
14928 };
14929 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014930 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014931 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014932 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14933 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014934 VkRenderPass rp;
14935 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14936 ASSERT_VK_SUCCESS(err);
14937
14938 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14939
14940 m_errorMonitor->VerifyFound();
14941
14942 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14943}
14944
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014945TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014946 TEST_DESCRIPTION(
14947 "Test that an error is produced for a variable output from "
14948 "the TCS without the patch decoration, but consumed in the TES "
14949 "with the decoration.");
14950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14951 "is per-vertex in tessellation control shader stage "
14952 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014953
Tony Barbour1fa09702017-03-16 12:09:08 -060014954 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014955 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14956
Chris Forbesc1e852d2016-04-04 19:26:42 +120014957 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014958 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014959 return;
14960 }
14961
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014962 char const *vsSource =
14963 "#version 450\n"
14964 "void main(){}\n";
14965 char const *tcsSource =
14966 "#version 450\n"
14967 "layout(location=0) out int x[];\n"
14968 "layout(vertices=3) out;\n"
14969 "void main(){\n"
14970 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14971 " gl_TessLevelInner[0] = 1;\n"
14972 " x[gl_InvocationID] = gl_InvocationID;\n"
14973 "}\n";
14974 char const *tesSource =
14975 "#version 450\n"
14976 "layout(triangles, equal_spacing, cw) in;\n"
14977 "layout(location=0) patch in int x;\n"
14978 "out gl_PerVertex { vec4 gl_Position; };\n"
14979 "void main(){\n"
14980 " gl_Position.xyz = gl_TessCoord;\n"
14981 " gl_Position.w = x;\n"
14982 "}\n";
14983 char const *fsSource =
14984 "#version 450\n"
14985 "layout(location=0) out vec4 color;\n"
14986 "void main(){\n"
14987 " color = vec4(1);\n"
14988 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014989
14990 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14991 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14992 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14993 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14994
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014995 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14996 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014997
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014998 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014999
15000 VkPipelineObj pipe(m_device);
15001 pipe.SetInputAssembly(&iasci);
15002 pipe.SetTessellation(&tsci);
15003 pipe.AddColorAttachment();
15004 pipe.AddShader(&vs);
15005 pipe.AddShader(&tcs);
15006 pipe.AddShader(&tes);
15007 pipe.AddShader(&fs);
15008
15009 VkDescriptorSetObj descriptorSet(m_device);
15010 descriptorSet.AppendDummy();
15011 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15012
15013 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15014
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015015 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015016}
15017
Karl Schultz6addd812016-02-02 17:17:23 -070015018TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015019 TEST_DESCRIPTION(
15020 "Test that an error is produced for a vertex attribute setup where multiple "
15021 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15023 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015024
Tony Barbour1fa09702017-03-16 12:09:08 -060015025 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015027
15028 /* Two binding descriptions for binding 0 */
15029 VkVertexInputBindingDescription input_bindings[2];
15030 memset(input_bindings, 0, sizeof(input_bindings));
15031
15032 VkVertexInputAttributeDescription input_attrib;
15033 memset(&input_attrib, 0, sizeof(input_attrib));
15034 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15035
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015036 char const *vsSource =
15037 "#version 450\n"
15038 "\n"
15039 "layout(location=0) in float x;\n" /* attrib provided float */
15040 "out gl_PerVertex {\n"
15041 " vec4 gl_Position;\n"
15042 "};\n"
15043 "void main(){\n"
15044 " gl_Position = vec4(x);\n"
15045 "}\n";
15046 char const *fsSource =
15047 "#version 450\n"
15048 "\n"
15049 "layout(location=0) out vec4 color;\n"
15050 "void main(){\n"
15051 " color = vec4(1);\n"
15052 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015053
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015054 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15055 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015056
15057 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015058 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015059 pipe.AddShader(&vs);
15060 pipe.AddShader(&fs);
15061
15062 pipe.AddVertexInputBindings(input_bindings, 2);
15063 pipe.AddVertexInputAttribs(&input_attrib, 1);
15064
Chris Forbes280ba2c2015-06-12 11:16:41 +120015065 VkDescriptorSetObj descriptorSet(m_device);
15066 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015067 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015068
Tony Barbour5781e8f2015-08-04 16:23:11 -060015069 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015070
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015071 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015072}
Chris Forbes8f68b562015-05-25 11:13:32 +120015073
Karl Schultz6addd812016-02-02 17:17:23 -070015074TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015075 TEST_DESCRIPTION(
15076 "Test that an error is produced for a fragment shader which does not "
15077 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015079
Tony Barbour1fa09702017-03-16 12:09:08 -060015080 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015081
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015082 char const *vsSource =
15083 "#version 450\n"
15084 "\n"
15085 "out gl_PerVertex {\n"
15086 " vec4 gl_Position;\n"
15087 "};\n"
15088 "void main(){\n"
15089 " gl_Position = vec4(1);\n"
15090 "}\n";
15091 char const *fsSource =
15092 "#version 450\n"
15093 "\n"
15094 "void main(){\n"
15095 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015096
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015097 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15098 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015099
15100 VkPipelineObj pipe(m_device);
15101 pipe.AddShader(&vs);
15102 pipe.AddShader(&fs);
15103
Chia-I Wu08accc62015-07-07 11:50:03 +080015104 /* set up CB 0, not written */
15105 pipe.AddColorAttachment();
15106 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015107
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015108 VkDescriptorSetObj descriptorSet(m_device);
15109 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015110 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015111
Tony Barbour5781e8f2015-08-04 16:23:11 -060015112 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015113
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015114 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015115}
15116
Karl Schultz6addd812016-02-02 17:17:23 -070015117TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015118 TEST_DESCRIPTION(
15119 "Test that a warning is produced for a fragment shader which provides a spurious "
15120 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015122 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015123
Tony Barbour1fa09702017-03-16 12:09:08 -060015124 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015125
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015126 char const *vsSource =
15127 "#version 450\n"
15128 "\n"
15129 "out gl_PerVertex {\n"
15130 " vec4 gl_Position;\n"
15131 "};\n"
15132 "void main(){\n"
15133 " gl_Position = vec4(1);\n"
15134 "}\n";
15135 char const *fsSource =
15136 "#version 450\n"
15137 "\n"
15138 "layout(location=0) out vec4 x;\n"
15139 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15140 "void main(){\n"
15141 " x = vec4(1);\n"
15142 " y = vec4(1);\n"
15143 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015144
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015145 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15146 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015147
15148 VkPipelineObj pipe(m_device);
15149 pipe.AddShader(&vs);
15150 pipe.AddShader(&fs);
15151
Chia-I Wu08accc62015-07-07 11:50:03 +080015152 /* set up CB 0, not written */
15153 pipe.AddColorAttachment();
15154 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015155 /* FS writes CB 1, but we don't configure it */
15156
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015157 VkDescriptorSetObj descriptorSet(m_device);
15158 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015159 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015160
Tony Barbour5781e8f2015-08-04 16:23:11 -060015161 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015162
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015163 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015164}
15165
Karl Schultz6addd812016-02-02 17:17:23 -070015166TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015167 TEST_DESCRIPTION(
15168 "Test that an error is produced for a mismatch between the fundamental "
15169 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015171
Tony Barbour1fa09702017-03-16 12:09:08 -060015172 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015173
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015174 char const *vsSource =
15175 "#version 450\n"
15176 "\n"
15177 "out gl_PerVertex {\n"
15178 " vec4 gl_Position;\n"
15179 "};\n"
15180 "void main(){\n"
15181 " gl_Position = vec4(1);\n"
15182 "}\n";
15183 char const *fsSource =
15184 "#version 450\n"
15185 "\n"
15186 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15187 "void main(){\n"
15188 " x = ivec4(1);\n"
15189 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015190
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015191 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15192 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015193
15194 VkPipelineObj pipe(m_device);
15195 pipe.AddShader(&vs);
15196 pipe.AddShader(&fs);
15197
Chia-I Wu08accc62015-07-07 11:50:03 +080015198 /* set up CB 0; type is UNORM by default */
15199 pipe.AddColorAttachment();
15200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015201
Chris Forbesa36d69e2015-05-25 11:13:44 +120015202 VkDescriptorSetObj descriptorSet(m_device);
15203 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015204 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015205
Tony Barbour5781e8f2015-08-04 16:23:11 -060015206 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015207
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015208 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015209}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015210
Karl Schultz6addd812016-02-02 17:17:23 -070015211TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015212 TEST_DESCRIPTION(
15213 "Test that an error is produced for a shader consuming a uniform "
15214 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015216
Tony Barbour1fa09702017-03-16 12:09:08 -060015217 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015218
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015219 char const *vsSource =
15220 "#version 450\n"
15221 "\n"
15222 "out gl_PerVertex {\n"
15223 " vec4 gl_Position;\n"
15224 "};\n"
15225 "void main(){\n"
15226 " gl_Position = vec4(1);\n"
15227 "}\n";
15228 char const *fsSource =
15229 "#version 450\n"
15230 "\n"
15231 "layout(location=0) out vec4 x;\n"
15232 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15233 "void main(){\n"
15234 " x = vec4(bar.y);\n"
15235 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015236
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015237 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15238 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015239
Chris Forbes556c76c2015-08-14 12:04:59 +120015240 VkPipelineObj pipe(m_device);
15241 pipe.AddShader(&vs);
15242 pipe.AddShader(&fs);
15243
15244 /* set up CB 0; type is UNORM by default */
15245 pipe.AddColorAttachment();
15246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15247
15248 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015249 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015250
15251 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15252
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015253 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015254}
15255
Chris Forbes5c59e902016-02-26 16:56:09 +130015256TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015257 TEST_DESCRIPTION(
15258 "Test that an error is produced for a shader consuming push constants "
15259 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015261
Tony Barbour1fa09702017-03-16 12:09:08 -060015262 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015263
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015264 char const *vsSource =
15265 "#version 450\n"
15266 "\n"
15267 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15268 "out gl_PerVertex {\n"
15269 " vec4 gl_Position;\n"
15270 "};\n"
15271 "void main(){\n"
15272 " gl_Position = vec4(consts.x);\n"
15273 "}\n";
15274 char const *fsSource =
15275 "#version 450\n"
15276 "\n"
15277 "layout(location=0) out vec4 x;\n"
15278 "void main(){\n"
15279 " x = vec4(1);\n"
15280 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015281
15282 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15283 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15284
15285 VkPipelineObj pipe(m_device);
15286 pipe.AddShader(&vs);
15287 pipe.AddShader(&fs);
15288
15289 /* set up CB 0; type is UNORM by default */
15290 pipe.AddColorAttachment();
15291 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15292
15293 VkDescriptorSetObj descriptorSet(m_device);
15294 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15295
15296 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15297
15298 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015299 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015300}
15301
Chris Forbes3fb17902016-08-22 14:57:55 +120015302TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015303 TEST_DESCRIPTION(
15304 "Test that an error is produced for a shader consuming an input attachment "
15305 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15307 "consumes input attachment index 0 but not provided in subpass");
15308
Tony Barbour1fa09702017-03-16 12:09:08 -060015309 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015311 char const *vsSource =
15312 "#version 450\n"
15313 "\n"
15314 "out gl_PerVertex {\n"
15315 " vec4 gl_Position;\n"
15316 "};\n"
15317 "void main(){\n"
15318 " gl_Position = vec4(1);\n"
15319 "}\n";
15320 char const *fsSource =
15321 "#version 450\n"
15322 "\n"
15323 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15324 "layout(location=0) out vec4 color;\n"
15325 "void main() {\n"
15326 " color = subpassLoad(x);\n"
15327 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015328
15329 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15330 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15331
15332 VkPipelineObj pipe(m_device);
15333 pipe.AddShader(&vs);
15334 pipe.AddShader(&fs);
15335 pipe.AddColorAttachment();
15336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15337
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015338 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15339 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015340 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015341 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015342 ASSERT_VK_SUCCESS(err);
15343
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015344 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015345 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015346 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015347 ASSERT_VK_SUCCESS(err);
15348
15349 // error here.
15350 pipe.CreateVKPipeline(pl, renderPass());
15351
15352 m_errorMonitor->VerifyFound();
15353
15354 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15355 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15356}
15357
Chris Forbes5a9a0472016-08-22 16:02:09 +120015358TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015359 TEST_DESCRIPTION(
15360 "Test that an error is produced for a shader consuming an input attachment "
15361 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15363 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15364
Tony Barbour1fa09702017-03-16 12:09:08 -060015365 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015366
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015367 char const *vsSource =
15368 "#version 450\n"
15369 "\n"
15370 "out gl_PerVertex {\n"
15371 " vec4 gl_Position;\n"
15372 "};\n"
15373 "void main(){\n"
15374 " gl_Position = vec4(1);\n"
15375 "}\n";
15376 char const *fsSource =
15377 "#version 450\n"
15378 "\n"
15379 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15380 "layout(location=0) out vec4 color;\n"
15381 "void main() {\n"
15382 " color = subpassLoad(x);\n"
15383 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015384
15385 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15386 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15387
15388 VkPipelineObj pipe(m_device);
15389 pipe.AddShader(&vs);
15390 pipe.AddShader(&fs);
15391 pipe.AddColorAttachment();
15392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15393
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015394 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15395 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015396 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015397 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015398 ASSERT_VK_SUCCESS(err);
15399
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015400 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015401 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015402 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015403 ASSERT_VK_SUCCESS(err);
15404
15405 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015406 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15407 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15408 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15409 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15410 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 +120015411 };
15412 VkAttachmentReference color = {
15413 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15414 };
15415 VkAttachmentReference input = {
15416 1, VK_IMAGE_LAYOUT_GENERAL,
15417 };
15418
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015419 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015420
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015421 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015422 VkRenderPass rp;
15423 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15424 ASSERT_VK_SUCCESS(err);
15425
15426 // error here.
15427 pipe.CreateVKPipeline(pl, rp);
15428
15429 m_errorMonitor->VerifyFound();
15430
15431 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15432 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15433 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15434}
15435
Chris Forbes541f7b02016-08-22 15:30:27 +120015436TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015437 TEST_DESCRIPTION(
15438 "Test that an error is produced for a shader consuming an input attachment "
15439 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015441 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015442
Tony Barbour1fa09702017-03-16 12:09:08 -060015443 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015444
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015445 char const *vsSource =
15446 "#version 450\n"
15447 "\n"
15448 "out gl_PerVertex {\n"
15449 " vec4 gl_Position;\n"
15450 "};\n"
15451 "void main(){\n"
15452 " gl_Position = vec4(1);\n"
15453 "}\n";
15454 char const *fsSource =
15455 "#version 450\n"
15456 "\n"
15457 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15458 "layout(location=0) out vec4 color;\n"
15459 "void main() {\n"
15460 " color = subpassLoad(xs[0]);\n"
15461 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015462
15463 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15464 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15465
15466 VkPipelineObj pipe(m_device);
15467 pipe.AddShader(&vs);
15468 pipe.AddShader(&fs);
15469 pipe.AddColorAttachment();
15470 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15471
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015472 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15473 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015474 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015475 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015476 ASSERT_VK_SUCCESS(err);
15477
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015478 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015479 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015480 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015481 ASSERT_VK_SUCCESS(err);
15482
15483 // error here.
15484 pipe.CreateVKPipeline(pl, renderPass());
15485
15486 m_errorMonitor->VerifyFound();
15487
15488 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15489 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15490}
15491
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015492TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015493 TEST_DESCRIPTION(
15494 "Test that an error is produced for a compute pipeline consuming a "
15495 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015497
Tony Barbour1fa09702017-03-16 12:09:08 -060015498 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015499
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015500 char const *csSource =
15501 "#version 450\n"
15502 "\n"
15503 "layout(local_size_x=1) in;\n"
15504 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15505 "void main(){\n"
15506 " x = vec4(1);\n"
15507 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015508
15509 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15510
15511 VkDescriptorSetObj descriptorSet(m_device);
15512 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15513
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015514 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15515 nullptr,
15516 0,
15517 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15518 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15519 descriptorSet.GetPipelineLayout(),
15520 VK_NULL_HANDLE,
15521 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015522
15523 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015524 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015525
15526 m_errorMonitor->VerifyFound();
15527
15528 if (err == VK_SUCCESS) {
15529 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15530 }
15531}
15532
Chris Forbes22a9b092016-07-19 14:34:05 +120015533TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015534 TEST_DESCRIPTION(
15535 "Test that an error is produced for a pipeline consuming a "
15536 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15538 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015539
Tony Barbour1fa09702017-03-16 12:09:08 -060015540 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015541
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015542 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15543 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015544 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015545 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015546 ASSERT_VK_SUCCESS(err);
15547
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015548 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015549 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015550 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015551 ASSERT_VK_SUCCESS(err);
15552
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015553 char const *csSource =
15554 "#version 450\n"
15555 "\n"
15556 "layout(local_size_x=1) in;\n"
15557 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15558 "void main() {\n"
15559 " x.x = 1.0f;\n"
15560 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015561 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15562
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015563 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15564 nullptr,
15565 0,
15566 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15567 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15568 pl,
15569 VK_NULL_HANDLE,
15570 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015571
15572 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015573 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015574
15575 m_errorMonitor->VerifyFound();
15576
15577 if (err == VK_SUCCESS) {
15578 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15579 }
15580
15581 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15582 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15583}
15584
Chris Forbes50020592016-07-27 13:52:41 +120015585TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015586 TEST_DESCRIPTION(
15587 "Test that an error is produced when an image view type "
15588 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015589
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015590 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 +120015591
Tony Barbour1fa09702017-03-16 12:09:08 -060015592 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15594
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015595 char const *vsSource =
15596 "#version 450\n"
15597 "\n"
15598 "out gl_PerVertex { vec4 gl_Position; };\n"
15599 "void main() { gl_Position = vec4(0); }\n";
15600 char const *fsSource =
15601 "#version 450\n"
15602 "\n"
15603 "layout(set=0, binding=0) uniform sampler3D s;\n"
15604 "layout(location=0) out vec4 color;\n"
15605 "void main() {\n"
15606 " color = texture(s, vec3(0));\n"
15607 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015608 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15609 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15610
15611 VkPipelineObj pipe(m_device);
15612 pipe.AddShader(&vs);
15613 pipe.AddShader(&fs);
15614 pipe.AddColorAttachment();
15615
15616 VkTextureObj texture(m_device, nullptr);
15617 VkSamplerObj sampler(m_device);
15618
15619 VkDescriptorSetObj descriptorSet(m_device);
15620 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15621 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15622
15623 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15624 ASSERT_VK_SUCCESS(err);
15625
Tony Barbour552f6c02016-12-21 14:34:07 -070015626 m_commandBuffer->BeginCommandBuffer();
15627 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015628
15629 m_commandBuffer->BindPipeline(pipe);
15630 m_commandBuffer->BindDescriptorSet(descriptorSet);
15631
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015632 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015633 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015634 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015635 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15636
15637 // error produced here.
15638 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15639
15640 m_errorMonitor->VerifyFound();
15641
Tony Barbour552f6c02016-12-21 14:34:07 -070015642 m_commandBuffer->EndRenderPass();
15643 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015644}
15645
Chris Forbes5533bfc2016-07-27 14:12:34 +120015646TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015647 TEST_DESCRIPTION(
15648 "Test that an error is produced when a multisampled images "
15649 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015650
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015652
Tony Barbour1fa09702017-03-16 12:09:08 -060015653 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15655
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015656 char const *vsSource =
15657 "#version 450\n"
15658 "\n"
15659 "out gl_PerVertex { vec4 gl_Position; };\n"
15660 "void main() { gl_Position = vec4(0); }\n";
15661 char const *fsSource =
15662 "#version 450\n"
15663 "\n"
15664 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15665 "layout(location=0) out vec4 color;\n"
15666 "void main() {\n"
15667 " color = texelFetch(s, ivec2(0), 0);\n"
15668 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015669 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15670 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15671
15672 VkPipelineObj pipe(m_device);
15673 pipe.AddShader(&vs);
15674 pipe.AddShader(&fs);
15675 pipe.AddColorAttachment();
15676
15677 VkTextureObj texture(m_device, nullptr);
15678 VkSamplerObj sampler(m_device);
15679
15680 VkDescriptorSetObj descriptorSet(m_device);
15681 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15682 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15683
15684 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15685 ASSERT_VK_SUCCESS(err);
15686
Tony Barbour552f6c02016-12-21 14:34:07 -070015687 m_commandBuffer->BeginCommandBuffer();
15688 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015689
15690 m_commandBuffer->BindPipeline(pipe);
15691 m_commandBuffer->BindDescriptorSet(descriptorSet);
15692
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015693 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015694 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015695 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015696 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15697
15698 // error produced here.
15699 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15700
15701 m_errorMonitor->VerifyFound();
15702
Tony Barbour552f6c02016-12-21 14:34:07 -070015703 m_commandBuffer->EndRenderPass();
15704 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015705}
15706
Mark Youngc48c4c12016-04-11 14:26:49 -060015707TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015708 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015709
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015710 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15711 {
15712 VkFormatProperties properties;
15713 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15714 if (properties.optimalTilingFeatures == 0) {
15715 printf(" Image format not supported; skipped.\n");
15716 return;
15717 }
15718 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015719
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015720 VkImageCreateInfo info = {};
15721 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15722 info.pNext = NULL;
15723 info.imageType = VK_IMAGE_TYPE_2D;
15724 info.format = format;
15725 info.extent.height = 32;
15726 info.extent.depth = 1;
15727 info.mipLevels = 1;
15728 info.arrayLayers = 1;
15729 info.samples = VK_SAMPLE_COUNT_1_BIT;
15730 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15731 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15732 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015733
15734 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015735 {
15736 VkImageFormatProperties properties;
15737 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15738 info.tiling, info.usage, info.flags, &properties);
15739 ASSERT_VK_SUCCESS(result);
15740 info.extent.width = properties.maxExtent.width + 1;
15741 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015742
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015743 VkImage image;
15744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15745 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015746 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015747}
15748
Mark Youngc48c4c12016-04-11 14:26:49 -060015749TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015750 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015751
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015752 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15753 {
15754 VkFormatProperties properties;
15755 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15756 if (properties.optimalTilingFeatures == 0) {
15757 printf(" Image format not supported; skipped.\n");
15758 return;
15759 }
15760 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015761
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015762 VkImageCreateInfo info = {};
15763 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15764 info.pNext = NULL;
15765 info.imageType = VK_IMAGE_TYPE_2D;
15766 info.format = format;
15767 info.extent.height = 32;
15768 info.extent.depth = 1;
15769 info.mipLevels = 1;
15770 info.arrayLayers = 1;
15771 info.samples = VK_SAMPLE_COUNT_1_BIT;
15772 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15773 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15774 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015775
15776 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015777 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015778
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015779 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060015780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015781 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15782 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015783 m_errorMonitor->VerifyFound();
15784}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015785
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015786TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015787 TEST_DESCRIPTION(
15788 "Create a render pass with an attachment description "
15789 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015790
Tony Barbour1fa09702017-03-16 12:09:08 -060015791 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015792 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15793
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015795
15796 VkAttachmentReference color_attach = {};
15797 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15798 color_attach.attachment = 0;
15799 VkSubpassDescription subpass = {};
15800 subpass.colorAttachmentCount = 1;
15801 subpass.pColorAttachments = &color_attach;
15802
15803 VkRenderPassCreateInfo rpci = {};
15804 rpci.subpassCount = 1;
15805 rpci.pSubpasses = &subpass;
15806 rpci.attachmentCount = 1;
15807 VkAttachmentDescription attach_desc = {};
15808 attach_desc.format = VK_FORMAT_UNDEFINED;
15809 rpci.pAttachments = &attach_desc;
15810 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15811 VkRenderPass rp;
15812 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15813
15814 m_errorMonitor->VerifyFound();
15815
15816 if (result == VK_SUCCESS) {
15817 vkDestroyRenderPass(m_device->device(), rp, NULL);
15818 }
15819}
15820
Karl Schultz6addd812016-02-02 17:17:23 -070015821TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015822 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015823
Mike Stroyana3082432015-09-25 13:39:21 -060015824 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015825 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15826 const int32_t tex_width = 32;
15827 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015828
15829 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015830 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15831 image_create_info.pNext = NULL;
15832 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15833 image_create_info.format = tex_format;
15834 image_create_info.extent.width = tex_width;
15835 image_create_info.extent.height = tex_height;
15836 image_create_info.extent.depth = 1;
15837 image_create_info.mipLevels = 1;
15838 image_create_info.arrayLayers = 1;
15839 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15840 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15841 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15842 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015843
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015844 VkImage image;
15845 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015846 ASSERT_VK_SUCCESS(err);
15847
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015848 VkMemoryRequirements requirements;
15849 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15850
15851 VkMemoryAllocateInfo alloc_info{};
15852 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15853 alloc_info.pNext = NULL;
15854 alloc_info.memoryTypeIndex = 0;
15855 alloc_info.allocationSize = requirements.size;
15856 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15857 ASSERT_TRUE(pass);
15858
15859 VkDeviceMemory memory;
15860 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15861 ASSERT_VK_SUCCESS(err);
15862
15863 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15864
Tobin Ehliscde08892015-09-22 10:11:37 -060015865 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015866 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015867 image_view_create_info.image = image;
15868 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15869 image_view_create_info.format = tex_format;
15870 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015871 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015872 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015873 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015874
15875 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015877 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015878 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015879
15880 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015881 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015882}
Mike Stroyana3082432015-09-25 13:39:21 -060015883
Mark Youngd339ba32016-05-30 13:28:35 -060015884TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15885 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015887 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015888
Tony Barbour1fa09702017-03-16 12:09:08 -060015889 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015890
15891 // Create an image and try to create a view with no memory backing the image
15892 VkImage image;
15893
15894 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15895 const int32_t tex_width = 32;
15896 const int32_t tex_height = 32;
15897
15898 VkImageCreateInfo image_create_info = {};
15899 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15900 image_create_info.pNext = NULL;
15901 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15902 image_create_info.format = tex_format;
15903 image_create_info.extent.width = tex_width;
15904 image_create_info.extent.height = tex_height;
15905 image_create_info.extent.depth = 1;
15906 image_create_info.mipLevels = 1;
15907 image_create_info.arrayLayers = 1;
15908 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15909 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15910 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15911 image_create_info.flags = 0;
15912
15913 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15914 ASSERT_VK_SUCCESS(err);
15915
15916 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015917 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015918 image_view_create_info.image = image;
15919 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15920 image_view_create_info.format = tex_format;
15921 image_view_create_info.subresourceRange.layerCount = 1;
15922 image_view_create_info.subresourceRange.baseMipLevel = 0;
15923 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015924 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015925
15926 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015927 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015928
15929 m_errorMonitor->VerifyFound();
15930 vkDestroyImage(m_device->device(), image, NULL);
15931 // If last error is success, it still created the view, so delete it.
15932 if (err == VK_SUCCESS) {
15933 vkDestroyImageView(m_device->device(), view, NULL);
15934 }
Mark Youngd339ba32016-05-30 13:28:35 -060015935}
15936
Karl Schultz6addd812016-02-02 17:17:23 -070015937TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015938 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015940
Tony Barbour1fa09702017-03-16 12:09:08 -060015941 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015942
Karl Schultz6addd812016-02-02 17:17:23 -070015943 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015944 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015945 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015946 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015947
15948 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015949 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015950 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015951 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15952 image_view_create_info.format = tex_format;
15953 image_view_create_info.subresourceRange.baseMipLevel = 0;
15954 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015955 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015956 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015957 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015958
15959 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015960 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015961
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015962 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015963}
15964
Mike Weiblena1e13f42017-02-09 21:25:59 -070015965TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15966 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15967
Tony Barbour1fa09702017-03-16 12:09:08 -060015968 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015969 VkSubresourceLayout subres_layout = {};
15970
15971 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15972 {
15973 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15974 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015975 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015976 ASSERT_TRUE(img.initialized());
15977
15978 VkImageSubresource subres = {};
15979 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15980 subres.mipLevel = 0;
15981 subres.arrayLayer = 0;
15982
15983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15984 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15985 m_errorMonitor->VerifyFound();
15986 }
15987
15988 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15989 {
15990 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015991 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015992 ASSERT_TRUE(img.initialized());
15993
15994 VkImageSubresource subres = {};
15995 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15996 subres.mipLevel = 0;
15997 subres.arrayLayer = 0;
15998
15999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16001 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16002 m_errorMonitor->VerifyFound();
16003 }
16004
16005 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16006 {
16007 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016008 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016009 ASSERT_TRUE(img.initialized());
16010
16011 VkImageSubresource subres = {};
16012 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16013 subres.mipLevel = 1; // ERROR: triggers VU 00739
16014 subres.arrayLayer = 0;
16015
16016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16017 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16018 m_errorMonitor->VerifyFound();
16019 }
16020
16021 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16022 {
16023 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016024 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016025 ASSERT_TRUE(img.initialized());
16026
16027 VkImageSubresource subres = {};
16028 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16029 subres.mipLevel = 0;
16030 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16031
16032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16033 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16034 m_errorMonitor->VerifyFound();
16035 }
16036}
16037
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016038TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016039 VkResult err;
16040 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016041
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016043
Tony Barbour1fa09702017-03-16 12:09:08 -060016044 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016045
16046 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016047 VkImage srcImage;
16048 VkImage dstImage;
16049 VkDeviceMemory srcMem;
16050 VkDeviceMemory destMem;
16051 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016052
16053 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016054 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16055 image_create_info.pNext = NULL;
16056 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16057 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16058 image_create_info.extent.width = 32;
16059 image_create_info.extent.height = 32;
16060 image_create_info.extent.depth = 1;
16061 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016062 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016063 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16064 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16065 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16066 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016067
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016068 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016069 ASSERT_VK_SUCCESS(err);
16070
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016071 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016072 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016073 ASSERT_VK_SUCCESS(err);
16074
16075 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016076 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016077 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16078 memAlloc.pNext = NULL;
16079 memAlloc.allocationSize = 0;
16080 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016081
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016082 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016083 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016084 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016085 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016086 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016087 ASSERT_VK_SUCCESS(err);
16088
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016089 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016090 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016091 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016092 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016093 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016094 ASSERT_VK_SUCCESS(err);
16095
16096 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16097 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016098 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016099 ASSERT_VK_SUCCESS(err);
16100
Tony Barbour552f6c02016-12-21 14:34:07 -070016101 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016102 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016103 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016104 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016105 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016106 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016107 copyRegion.srcOffset.x = 0;
16108 copyRegion.srcOffset.y = 0;
16109 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016110 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016111 copyRegion.dstSubresource.mipLevel = 0;
16112 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016113 // Introduce failure by forcing the dst layerCount to differ from src
16114 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016115 copyRegion.dstOffset.x = 0;
16116 copyRegion.dstOffset.y = 0;
16117 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016118 copyRegion.extent.width = 1;
16119 copyRegion.extent.height = 1;
16120 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016121 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016122 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016123
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016124 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016125
Chia-I Wuf7458c52015-10-26 21:10:41 +080016126 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016127 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016128 vkFreeMemory(m_device->device(), srcMem, NULL);
16129 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016130}
16131
Tony Barbourd6673642016-05-05 14:46:39 -060016132TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016133 TEST_DESCRIPTION("Creating images with unsuported formats ");
16134
Tony Barbour1fa09702017-03-16 12:09:08 -060016135 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016137
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016138 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016139 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016140 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016141 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16142 image_create_info.format = VK_FORMAT_UNDEFINED;
16143 image_create_info.extent.width = 32;
16144 image_create_info.extent.height = 32;
16145 image_create_info.extent.depth = 1;
16146 image_create_info.mipLevels = 1;
16147 image_create_info.arrayLayers = 1;
16148 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16149 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16150 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016151
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16153 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016154
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016155 VkImage image;
16156 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016157 m_errorMonitor->VerifyFound();
16158
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016159 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016160 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016161 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16162 VkFormat format = static_cast<VkFormat>(f);
16163 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016164 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016165 unsupported = format;
16166 break;
16167 }
16168 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016169
Tony Barbourd6673642016-05-05 14:46:39 -060016170 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016171 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016173
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016174 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016175 m_errorMonitor->VerifyFound();
16176 }
16177}
16178
16179TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016180 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16181
Tony Barbour1fa09702017-03-16 12:09:08 -060016182 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016183 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016184 if (!depth_format) {
16185 return;
16186 }
Tony Barbourd6673642016-05-05 14:46:39 -060016187
16188 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016189 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 -060016190 VK_IMAGE_TILING_OPTIMAL, 0);
16191 ASSERT_TRUE(image.initialized());
16192
16193 VkImageView imgView;
16194 VkImageViewCreateInfo imgViewInfo = {};
16195 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16196 imgViewInfo.image = image.handle();
16197 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16198 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16199 imgViewInfo.subresourceRange.layerCount = 1;
16200 imgViewInfo.subresourceRange.baseMipLevel = 0;
16201 imgViewInfo.subresourceRange.levelCount = 1;
16202 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16203
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016204 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016205 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016207 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16208 m_errorMonitor->VerifyFound();
16209 imgViewInfo.subresourceRange.baseMipLevel = 0;
16210
Tony Barbourd6673642016-05-05 14:46:39 -060016211 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16212 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016214 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16215 m_errorMonitor->VerifyFound();
16216 imgViewInfo.subresourceRange.levelCount = 1;
16217
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016218 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16219 imgViewInfo.subresourceRange.levelCount = 2;
16220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16221 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16222 m_errorMonitor->VerifyFound();
16223 imgViewInfo.subresourceRange.levelCount = 1;
16224
16225 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16226 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16228 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16229 m_errorMonitor->VerifyFound();
16230 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16231
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016232 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16233 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016234 m_errorMonitor->SetDesiredFailureMsg(
16235 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16236 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016237 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16238 m_errorMonitor->VerifyFound();
16239 imgViewInfo.subresourceRange.layerCount = 1;
16240
Tony Barbourd6673642016-05-05 14:46:39 -060016241 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016242 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016243 m_errorMonitor->SetDesiredFailureMsg(
16244 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16245 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016246 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16247 m_errorMonitor->VerifyFound();
16248 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16249
Tony Barbourd6673642016-05-05 14:46:39 -060016250 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16251 // VIEW_CREATE_ERROR
16252 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016254 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16255 m_errorMonitor->VerifyFound();
16256 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16257
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016258 // TODO: Update framework to easily passing mutable flag into ImageObj init
16259 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016260 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16261 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16262 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016263 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16264 // VIEW_CREATE_ERROR
16265 VkImageCreateInfo mutImgInfo = image.create_info();
16266 VkImage mutImage;
16267 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016268 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016269 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16270 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016271 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016272 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016273
16274 VkMemoryRequirements requirements;
16275 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16276
16277 VkMemoryAllocateInfo alloc_info{};
16278 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16279 alloc_info.pNext = NULL;
16280 alloc_info.memoryTypeIndex = 0;
16281 alloc_info.allocationSize = requirements.size;
16282 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16283 ASSERT_TRUE(pass);
16284
16285 VkDeviceMemory memory;
16286 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16287 ASSERT_VK_SUCCESS(ret);
16288
16289 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16290 ASSERT_VK_SUCCESS(ret);
16291
Tony Barbourd6673642016-05-05 14:46:39 -060016292 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016294 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16295 m_errorMonitor->VerifyFound();
16296 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016297
16298 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016299 vkDestroyImage(m_device->handle(), mutImage, NULL);
16300}
16301
Dave Houlton75967fc2017-03-06 17:21:16 -070016302TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16303 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16304
Tony Barbour1fa09702017-03-16 12:09:08 -060016305 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016306
Jamie Madill35127872017-03-15 16:17:46 -040016307 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016308 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16309 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16310 if (device_features.textureCompressionBC) {
16311 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16312 } else if (device_features.textureCompressionETC2) {
16313 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16314 } else if (device_features.textureCompressionASTC_LDR) {
16315 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16316 } else {
16317 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16318 return;
16319 }
16320
16321 VkImageCreateInfo ci;
16322 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16323 ci.pNext = NULL;
16324 ci.flags = 0;
16325 ci.imageType = VK_IMAGE_TYPE_2D;
16326 ci.format = compressed_format;
16327 ci.extent = {32, 32, 1};
16328 ci.mipLevels = 6;
16329 ci.arrayLayers = 1;
16330 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16331 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16332 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16333 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16334 ci.queueFamilyIndexCount = 0;
16335 ci.pQueueFamilyIndices = NULL;
16336 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16337
16338 VkImageObj image(m_device);
16339 image.init(&ci);
16340 ASSERT_TRUE(image.initialized());
16341
16342 VkImageObj odd_image(m_device);
16343 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16344 odd_image.init(&ci);
16345 ASSERT_TRUE(odd_image.initialized());
16346
16347 // Allocate buffers
16348 VkMemoryPropertyFlags reqs = 0;
16349 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16350 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16351 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16352 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16353 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16354
16355 VkBufferImageCopy region = {};
16356 region.bufferRowLength = 0;
16357 region.bufferImageHeight = 0;
16358 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16359 region.imageSubresource.layerCount = 1;
16360 region.imageOffset = {0, 0, 0};
16361 region.bufferOffset = 0;
16362
16363 // start recording
16364 m_commandBuffer->BeginCommandBuffer();
16365
16366 // Mip level copies that work - 5 levels
16367 m_errorMonitor->ExpectSuccess();
16368
16369 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16370 region.imageExtent = {32, 32, 1};
16371 region.imageSubresource.mipLevel = 0;
16372 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16373 &region);
16374 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16375 &region);
16376
16377 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16378 region.imageExtent = {8, 8, 1};
16379 region.imageSubresource.mipLevel = 2;
16380 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16381 &region);
16382 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16383 &region);
16384
16385 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16386 region.imageExtent = {4, 4, 1};
16387 region.imageSubresource.mipLevel = 3;
16388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16389 &region);
16390 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16391 &region);
16392
16393 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16394 region.imageExtent = {2, 2, 1};
16395 region.imageSubresource.mipLevel = 4;
16396 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16397 &region);
16398 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16399 &region);
16400
16401 region.imageExtent = {1, 1, 1};
16402 region.imageSubresource.mipLevel = 5;
16403 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16404 &region);
16405 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16406 &region);
16407 m_errorMonitor->VerifyNotFound();
16408
16409 // Buffer must accomodate a full compressed block, regardless of texel count
16410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16411 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16412 &region);
16413 m_errorMonitor->VerifyFound();
16414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16415 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16416 &region);
16417 m_errorMonitor->VerifyFound();
16418
16419 // Copy width < compressed block size, but not the full mip width
16420 region.imageExtent = {1, 2, 1};
16421 region.imageSubresource.mipLevel = 4;
16422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16423 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16424 &region);
16425 m_errorMonitor->VerifyFound();
16426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16427 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16428 &region);
16429 m_errorMonitor->VerifyFound();
16430
16431 // Copy height < compressed block size but not the full mip height
16432 region.imageExtent = {2, 1, 1};
16433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16434 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16435 &region);
16436 m_errorMonitor->VerifyFound();
16437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16438 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16439 &region);
16440 m_errorMonitor->VerifyFound();
16441
16442 // Offsets must be multiple of compressed block size
16443 region.imageOffset = {1, 1, 0};
16444 region.imageExtent = {1, 1, 1};
16445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16446 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16447 &region);
16448 m_errorMonitor->VerifyFound();
16449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16450 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16451 &region);
16452 m_errorMonitor->VerifyFound();
16453
16454 // Offset + extent width = mip width - should succeed
16455 region.imageOffset = {4, 4, 0};
16456 region.imageExtent = {3, 4, 1};
16457 region.imageSubresource.mipLevel = 2;
16458 m_errorMonitor->ExpectSuccess();
16459 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16460 &region);
16461 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16462 &region);
16463 m_errorMonitor->VerifyNotFound();
16464
16465 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16466 region.imageExtent = {4, 4, 1};
16467 m_errorMonitor->ExpectSuccess();
16468 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16469 &region);
16470 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16471 &region);
16472 m_errorMonitor->VerifyNotFound();
16473
16474 // Offset + extent width < mip width and not a multiple of block width - should fail
16475 region.imageExtent = {3, 3, 1};
16476 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16477 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16478 &region);
16479 m_errorMonitor->VerifyFound();
16480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16481 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16482 &region);
16483 m_errorMonitor->VerifyFound();
16484}
16485
Dave Houlton59a20702017-02-02 17:26:23 -070016486TEST_F(VkLayerTest, ImageBufferCopyTests) {
16487 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16488
Tony Barbour1fa09702017-03-16 12:09:08 -060016489 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016490 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16491 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16492 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16493 return;
16494 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016495
16496 // Bail if any dimension of transfer granularity is 0.
16497 auto index = m_device->graphics_queue_node_index_;
16498 auto queue_family_properties = m_device->phy().queue_properties();
16499 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16500 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16501 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16502 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16503 return;
16504 }
16505
Dave Houlton59a20702017-02-02 17:26:23 -070016506 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16507 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16508 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016509 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16510 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16511 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16512 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16513
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016514 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016515 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16516 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016517 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016518 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16519 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016520 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 -070016521 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016522 ASSERT_TRUE(image_64k.initialized());
16523 ASSERT_TRUE(image_16k.initialized());
16524 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016525
Dave Houltonf3229d52017-02-21 15:59:08 -070016526 // Verify all needed Depth/Stencil formats are supported
16527 bool missing_ds_support = false;
16528 VkFormatProperties props = {0, 0, 0};
16529 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16530 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16531 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16532 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16533 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16534 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16535 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16536 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16537
16538 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016539 ds_image_4D_1S.Init(
16540 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016541 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16542 VK_IMAGE_TILING_OPTIMAL, 0);
16543 ASSERT_TRUE(ds_image_4D_1S.initialized());
16544
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016545 ds_image_3D_1S.Init(
16546 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016547 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16548 VK_IMAGE_TILING_OPTIMAL, 0);
16549 ASSERT_TRUE(ds_image_3D_1S.initialized());
16550
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016551 ds_image_2D.Init(
16552 256, 256, 1, VK_FORMAT_D16_UNORM,
16553 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16554 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016555 ASSERT_TRUE(ds_image_2D.initialized());
16556
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016557 ds_image_1S.Init(
16558 256, 256, 1, VK_FORMAT_S8_UINT,
16559 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16560 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016561 ASSERT_TRUE(ds_image_1S.initialized());
16562 }
16563
16564 // Allocate buffers
16565 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016566 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016567 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16568 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16569 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16570 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016571
16572 VkBufferImageCopy region = {};
16573 region.bufferRowLength = 0;
16574 region.bufferImageHeight = 0;
16575 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16576 region.imageSubresource.layerCount = 1;
16577 region.imageOffset = {0, 0, 0};
16578 region.imageExtent = {64, 64, 1};
16579 region.bufferOffset = 0;
16580
16581 // attempt copies before putting command buffer in recording state
16582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16583 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16584 &region);
16585 m_errorMonitor->VerifyFound();
16586
16587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16588 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16589 &region);
16590 m_errorMonitor->VerifyFound();
16591
16592 // start recording
16593 m_commandBuffer->BeginCommandBuffer();
16594
16595 // successful copies
16596 m_errorMonitor->ExpectSuccess();
16597 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16598 &region);
16599 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16600 &region);
16601 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16602 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16603 &region);
16604 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16605 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16606 &region);
16607 region.imageOffset.x = 0;
16608 region.imageExtent.height = 64;
16609 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16610 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16611 &region);
16612 m_errorMonitor->VerifyNotFound();
16613
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016614 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016615 region.imageExtent = {65, 64, 1};
16616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16617 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16618 &region);
16619 m_errorMonitor->VerifyFound();
16620
16621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16622 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16623 &region);
16624 m_errorMonitor->VerifyFound();
16625
16626 // image/buffer too small (offset) on copy to image
16627 region.imageExtent = {64, 64, 1};
16628 region.imageOffset = {0, 4, 0};
16629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16630 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16631 &region);
16632 m_errorMonitor->VerifyFound();
16633
16634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16635 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16636 &region);
16637 m_errorMonitor->VerifyFound();
16638
16639 // image/buffer too small on copy to buffer
16640 region.imageExtent = {64, 64, 1};
16641 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016642 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16644 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16645 &region);
16646 m_errorMonitor->VerifyFound();
16647
16648 region.imageExtent = {64, 65, 1};
16649 region.bufferOffset = 0;
16650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16651 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16652 &region);
16653 m_errorMonitor->VerifyFound();
16654
16655 // buffer size ok but rowlength causes loose packing
16656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16657 region.imageExtent = {64, 64, 1};
16658 region.bufferRowLength = 68;
16659 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16660 &region);
16661 m_errorMonitor->VerifyFound();
16662
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016663 // An extent with zero area should produce a warning, but no error
16664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16665 region.imageExtent.width = 0;
16666 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16667 &region);
16668 m_errorMonitor->VerifyFound();
16669
Dave Houlton59a20702017-02-02 17:26:23 -070016670 // aspect bits
16671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16672 region.imageExtent = {64, 64, 1};
16673 region.bufferRowLength = 0;
16674 region.bufferImageHeight = 0;
16675 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16676 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16677 buffer_16k.handle(), 1, &region);
16678 m_errorMonitor->VerifyFound();
16679
16680 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16681 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16682 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16683 &region);
16684 m_errorMonitor->VerifyFound();
16685
16686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16687 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16688 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16689 buffer_16k.handle(), 1, &region);
16690 m_errorMonitor->VerifyFound();
16691
Dave Houltonf3229d52017-02-21 15:59:08 -070016692 // Test Depth/Stencil copies
16693 if (missing_ds_support) {
16694 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16695 } else {
16696 VkBufferImageCopy ds_region = {};
16697 ds_region.bufferOffset = 0;
16698 ds_region.bufferRowLength = 0;
16699 ds_region.bufferImageHeight = 0;
16700 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16701 ds_region.imageSubresource.mipLevel = 0;
16702 ds_region.imageSubresource.baseArrayLayer = 0;
16703 ds_region.imageSubresource.layerCount = 1;
16704 ds_region.imageOffset = {0, 0, 0};
16705 ds_region.imageExtent = {256, 256, 1};
16706
16707 // Depth copies that should succeed
16708 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16709 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16710 buffer_256k.handle(), 1, &ds_region);
16711 m_errorMonitor->VerifyNotFound();
16712
16713 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16714 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16715 buffer_256k.handle(), 1, &ds_region);
16716 m_errorMonitor->VerifyNotFound();
16717
16718 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16719 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16720 buffer_128k.handle(), 1, &ds_region);
16721 m_errorMonitor->VerifyNotFound();
16722
16723 // Depth copies that should fail
16724 ds_region.bufferOffset = 4;
16725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16726 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16727 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16728 buffer_256k.handle(), 1, &ds_region);
16729 m_errorMonitor->VerifyFound();
16730
16731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16732 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16733 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16734 buffer_256k.handle(), 1, &ds_region);
16735 m_errorMonitor->VerifyFound();
16736
16737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16738 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16739 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16740 buffer_128k.handle(), 1, &ds_region);
16741 m_errorMonitor->VerifyFound();
16742
16743 // Stencil copies that should succeed
16744 ds_region.bufferOffset = 0;
16745 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16746 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16747 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16748 buffer_64k.handle(), 1, &ds_region);
16749 m_errorMonitor->VerifyNotFound();
16750
16751 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16752 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16753 buffer_64k.handle(), 1, &ds_region);
16754 m_errorMonitor->VerifyNotFound();
16755
16756 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16757 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16758 buffer_64k.handle(), 1, &ds_region);
16759 m_errorMonitor->VerifyNotFound();
16760
16761 // Stencil copies that should fail
16762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16763 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16764 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16765 buffer_16k.handle(), 1, &ds_region);
16766 m_errorMonitor->VerifyFound();
16767
16768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16769 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16770 ds_region.bufferRowLength = 260;
16771 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16772 buffer_64k.handle(), 1, &ds_region);
16773 m_errorMonitor->VerifyFound();
16774
16775 ds_region.bufferRowLength = 0;
16776 ds_region.bufferOffset = 4;
16777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16778 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16779 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16780 buffer_64k.handle(), 1, &ds_region);
16781 m_errorMonitor->VerifyFound();
16782 }
16783
Dave Houlton584d51e2017-02-16 12:52:54 -070016784 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016785 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016786 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016787 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16788 device_features.textureCompressionASTC_LDR)) {
16789 printf(" No compressed formats supported - block compression tests skipped.\n");
16790 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016791 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16792 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016793 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016794 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16795 0);
16796 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 -070016797 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016798 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016799 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 -070016800 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016801 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 -070016802 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016803 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016804 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 -070016805 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016806 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 -070016807 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016808 }
16809 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016810
Dave Houlton584d51e2017-02-16 12:52:54 -070016811 // Just fits
16812 m_errorMonitor->ExpectSuccess();
16813 region.imageExtent = {128, 128, 1};
16814 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16815 buffer_16k.handle(), 1, &region);
16816 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016817
Dave Houlton584d51e2017-02-16 12:52:54 -070016818 // with offset, too big for buffer
16819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16820 region.bufferOffset = 16;
16821 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16822 buffer_16k.handle(), 1, &region);
16823 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016824 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016825
Dave Houlton67e9b532017-03-02 17:00:10 -070016826 // extents that are not a multiple of compressed block size
16827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16828 region.imageExtent.width = 66;
16829 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16830 buffer_16k.handle(), 1, &region);
16831 m_errorMonitor->VerifyFound();
16832 region.imageExtent.width = 128;
16833
16834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016835 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016836 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16837 buffer_16k.handle(), 1, &region);
16838 m_errorMonitor->VerifyFound();
16839 region.imageExtent.height = 128;
16840
16841 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16842
16843 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16844 m_errorMonitor->ExpectSuccess();
16845 region.imageExtent.width = 66;
16846 region.imageOffset.x = 64;
16847 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16848 buffer_16k.handle(), 1, &region);
16849 region.imageExtent.width = 16;
16850 region.imageOffset.x = 0;
16851 region.imageExtent.height = 2;
16852 region.imageOffset.y = 128;
16853 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016854 buffer_16k.handle(), 1, &region);
16855 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016856 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016857
Dave Houlton584d51e2017-02-16 12:52:54 -070016858 // buffer offset must be a multiple of texel block size (16)
16859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16861 region.imageExtent = {64, 64, 1};
16862 region.bufferOffset = 24;
16863 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16864 buffer_16k.handle(), 1, &region);
16865 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016866
Dave Houlton584d51e2017-02-16 12:52:54 -070016867 // rowlength not a multiple of block width (4)
16868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16869 region.bufferOffset = 0;
16870 region.bufferRowLength = 130;
16871 region.bufferImageHeight = 0;
16872 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16873 buffer_64k.handle(), 1, &region);
16874 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016875
Dave Houlton584d51e2017-02-16 12:52:54 -070016876 // imageheight not a multiple of block height (4)
16877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16878 region.bufferRowLength = 0;
16879 region.bufferImageHeight = 130;
16880 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16881 buffer_64k.handle(), 1, &region);
16882 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016883 }
Dave Houlton59a20702017-02-02 17:26:23 -070016884}
16885
Tony Barbourd6673642016-05-05 14:46:39 -060016886TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016887 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016888
Tony Barbour1fa09702017-03-16 12:09:08 -060016889 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016890
Rene Lindsay135204f2016-12-22 17:11:09 -070016891 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016892 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016893 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 -070016894 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016895 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016896 vk_testing::Buffer buffer;
16897 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016898 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016899 VkBufferImageCopy region = {};
16900 region.bufferRowLength = 128;
16901 region.bufferImageHeight = 128;
16902 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16903 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016904 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016905 region.imageExtent.height = 4;
16906 region.imageExtent.width = 4;
16907 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016908
16909 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016910 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 -070016911 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016912 ASSERT_TRUE(image2.initialized());
16913 vk_testing::Buffer buffer2;
16914 VkMemoryPropertyFlags reqs2 = 0;
16915 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16916 VkBufferImageCopy region2 = {};
16917 region2.bufferRowLength = 128;
16918 region2.bufferImageHeight = 128;
16919 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16920 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16921 region2.imageSubresource.layerCount = 1;
16922 region2.imageExtent.height = 4;
16923 region2.imageExtent.width = 4;
16924 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016925 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016926
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016927 // Image must have offset.z of 0 and extent.depth of 1
16928 // Introduce failure by setting imageExtent.depth to 0
16929 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016931 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016932 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016933 m_errorMonitor->VerifyFound();
16934
16935 region.imageExtent.depth = 1;
16936
16937 // Image must have offset.z of 0 and extent.depth of 1
16938 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016939 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016940 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016943 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016944 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016945 m_errorMonitor->VerifyFound();
16946
16947 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016948 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16949 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016950 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016952 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16953 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016954 m_errorMonitor->VerifyFound();
16955
16956 // BufferOffset must be a multiple of 4
16957 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016958 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016960 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16961 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016962 m_errorMonitor->VerifyFound();
16963
16964 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16965 region.bufferOffset = 0;
16966 region.imageExtent.height = 128;
16967 region.imageExtent.width = 128;
16968 // Introduce failure by setting bufferRowLength > 0 but less than width
16969 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016971 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16972 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016973 m_errorMonitor->VerifyFound();
16974
16975 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16976 region.bufferRowLength = 128;
16977 // Introduce failure by setting bufferRowHeight > 0 but less than height
16978 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016980 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16981 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016982 m_errorMonitor->VerifyFound();
16983
16984 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016985 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016986 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 -070016987 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016988 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016989 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 -070016990 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016991 VkImageBlit blitRegion = {};
16992 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16993 blitRegion.srcSubresource.baseArrayLayer = 0;
16994 blitRegion.srcSubresource.layerCount = 1;
16995 blitRegion.srcSubresource.mipLevel = 0;
16996 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16997 blitRegion.dstSubresource.baseArrayLayer = 0;
16998 blitRegion.dstSubresource.layerCount = 1;
16999 blitRegion.dstSubresource.mipLevel = 0;
17000
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017001 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17003 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17005 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017006 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17007 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017008 m_errorMonitor->VerifyFound();
17009
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017011 VkImageMemoryBarrier img_barrier;
17012 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17013 img_barrier.pNext = NULL;
17014 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17015 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17016 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17017 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17018 img_barrier.image = image.handle();
17019 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17020 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17021 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17022 img_barrier.subresourceRange.baseArrayLayer = 0;
17023 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017024 img_barrier.subresourceRange.layerCount = 0;
17025 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017026 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17027 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017028 m_errorMonitor->VerifyFound();
17029 img_barrier.subresourceRange.layerCount = 1;
17030}
17031
17032TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017033 TEST_DESCRIPTION("Exceed the limits of image format ");
17034
Tony Barbour1fa09702017-03-16 12:09:08 -060017035 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017036
17037 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17038 {
17039 VkFormatProperties properties;
17040 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17041 if (properties.linearTilingFeatures == 0) {
17042 printf(" Image format not supported; skipped.\n");
17043 return;
17044 }
17045 }
17046
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017048 VkImageCreateInfo image_create_info = {};
17049 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17050 image_create_info.pNext = NULL;
17051 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017052 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017053 image_create_info.extent.width = 32;
17054 image_create_info.extent.height = 32;
17055 image_create_info.extent.depth = 1;
17056 image_create_info.mipLevels = 1;
17057 image_create_info.arrayLayers = 1;
17058 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17059 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17060 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17061 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17062 image_create_info.flags = 0;
17063
17064 VkImage nullImg;
17065 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017066 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17067 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017068 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017069 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17070 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17071 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017072 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017073
Tony Barbour0907e362017-03-09 15:05:30 -070017074 uint32_t maxDim =
17075 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17076 // If max mip levels exceeds image extents, skip the max mip levels test
17077 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17079 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17080 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17081 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17082 m_errorMonitor->VerifyFound();
17083 image_create_info.mipLevels = 1;
17084 }
Tony Barbourd6673642016-05-05 14:46:39 -060017085
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017087 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17088 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17089 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17090 m_errorMonitor->VerifyFound();
17091 image_create_info.arrayLayers = 1;
17092
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017094 int samples = imgFmtProps.sampleCounts >> 1;
17095 image_create_info.samples = (VkSampleCountFlagBits)samples;
17096 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17097 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17098 m_errorMonitor->VerifyFound();
17099 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17100
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17102 "pCreateInfo->initialLayout, must be "
17103 "VK_IMAGE_LAYOUT_UNDEFINED or "
17104 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017105 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17106 // Expect INVALID_LAYOUT
17107 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17108 m_errorMonitor->VerifyFound();
17109 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17110}
17111
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017112TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017113 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017115
Tony Barbour1fa09702017-03-16 12:09:08 -060017116 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017117
17118 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017119 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 -060017120 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017121 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 -060017122
Tony Barbour552f6c02016-12-21 14:34:07 -070017123 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017124 VkImageCopy copy_region;
17125 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17126 copy_region.srcSubresource.mipLevel = 0;
17127 copy_region.srcSubresource.baseArrayLayer = 0;
17128 copy_region.srcSubresource.layerCount = 0;
17129 copy_region.srcOffset.x = 0;
17130 copy_region.srcOffset.y = 0;
17131 copy_region.srcOffset.z = 0;
17132 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17133 copy_region.dstSubresource.mipLevel = 0;
17134 copy_region.dstSubresource.baseArrayLayer = 0;
17135 copy_region.dstSubresource.layerCount = 0;
17136 copy_region.dstOffset.x = 0;
17137 copy_region.dstOffset.y = 0;
17138 copy_region.dstOffset.z = 0;
17139 copy_region.extent.width = 64;
17140 copy_region.extent.height = 64;
17141 copy_region.extent.depth = 1;
17142 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17143 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017144 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017145
17146 m_errorMonitor->VerifyFound();
17147}
17148
17149TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017150 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017152
Tony Barbour1fa09702017-03-16 12:09:08 -060017153 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017154
17155 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017156 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 -060017157 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017158 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 -060017159
Tony Barbour552f6c02016-12-21 14:34:07 -070017160 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017161 VkImageCopy copy_region;
17162 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17163 copy_region.srcSubresource.mipLevel = 0;
17164 copy_region.srcSubresource.baseArrayLayer = 0;
17165 copy_region.srcSubresource.layerCount = 0;
17166 copy_region.srcOffset.x = 0;
17167 copy_region.srcOffset.y = 0;
17168 copy_region.srcOffset.z = 0;
17169 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17170 copy_region.dstSubresource.mipLevel = 0;
17171 copy_region.dstSubresource.baseArrayLayer = 0;
17172 copy_region.dstSubresource.layerCount = 0;
17173 copy_region.dstOffset.x = 0;
17174 copy_region.dstOffset.y = 0;
17175 copy_region.dstOffset.z = 0;
17176 copy_region.extent.width = 64;
17177 copy_region.extent.height = 64;
17178 copy_region.extent.depth = 1;
17179 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17180 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017181 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017182
17183 m_errorMonitor->VerifyFound();
17184}
17185
Karl Schultz6addd812016-02-02 17:17:23 -070017186TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017187 VkResult err;
17188 bool pass;
17189
17190 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017192
Tony Barbour1fa09702017-03-16 12:09:08 -060017193 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017194
17195 // Create two images of different types and try to copy between them
17196 VkImage srcImage;
17197 VkImage dstImage;
17198 VkDeviceMemory srcMem;
17199 VkDeviceMemory destMem;
17200 VkMemoryRequirements memReqs;
17201
17202 VkImageCreateInfo image_create_info = {};
17203 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17204 image_create_info.pNext = NULL;
17205 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17206 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17207 image_create_info.extent.width = 32;
17208 image_create_info.extent.height = 32;
17209 image_create_info.extent.depth = 1;
17210 image_create_info.mipLevels = 1;
17211 image_create_info.arrayLayers = 1;
17212 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17213 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17214 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17215 image_create_info.flags = 0;
17216
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017217 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017218 ASSERT_VK_SUCCESS(err);
17219
17220 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17221 // Introduce failure by creating second image with a different-sized format.
17222 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017223 VkFormatProperties properties;
17224 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17225 if (properties.optimalTilingFeatures == 0) {
17226 printf(" Image format not supported; skipped.\n");
17227 return;
17228 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017229
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017230 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017231 ASSERT_VK_SUCCESS(err);
17232
17233 // Allocate memory
17234 VkMemoryAllocateInfo memAlloc = {};
17235 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17236 memAlloc.pNext = NULL;
17237 memAlloc.allocationSize = 0;
17238 memAlloc.memoryTypeIndex = 0;
17239
17240 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17241 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017242 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017243 ASSERT_TRUE(pass);
17244 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17245 ASSERT_VK_SUCCESS(err);
17246
17247 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17248 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017249 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017250 ASSERT_TRUE(pass);
17251 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17252 ASSERT_VK_SUCCESS(err);
17253
17254 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17255 ASSERT_VK_SUCCESS(err);
17256 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17257 ASSERT_VK_SUCCESS(err);
17258
Tony Barbour552f6c02016-12-21 14:34:07 -070017259 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017260 VkImageCopy copyRegion;
17261 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17262 copyRegion.srcSubresource.mipLevel = 0;
17263 copyRegion.srcSubresource.baseArrayLayer = 0;
17264 copyRegion.srcSubresource.layerCount = 0;
17265 copyRegion.srcOffset.x = 0;
17266 copyRegion.srcOffset.y = 0;
17267 copyRegion.srcOffset.z = 0;
17268 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17269 copyRegion.dstSubresource.mipLevel = 0;
17270 copyRegion.dstSubresource.baseArrayLayer = 0;
17271 copyRegion.dstSubresource.layerCount = 0;
17272 copyRegion.dstOffset.x = 0;
17273 copyRegion.dstOffset.y = 0;
17274 copyRegion.dstOffset.z = 0;
17275 copyRegion.extent.width = 1;
17276 copyRegion.extent.height = 1;
17277 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017278 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017279 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017280
17281 m_errorMonitor->VerifyFound();
17282
17283 vkDestroyImage(m_device->device(), srcImage, NULL);
17284 vkDestroyImage(m_device->device(), dstImage, NULL);
17285 vkFreeMemory(m_device->device(), srcMem, NULL);
17286 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017287}
17288
Karl Schultz6addd812016-02-02 17:17:23 -070017289TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17290 VkResult err;
17291 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017292
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017293 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17295 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017296
Tony Barbour1fa09702017-03-16 12:09:08 -060017297 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017298 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017299 if (!depth_format) {
17300 return;
17301 }
Mike Stroyana3082432015-09-25 13:39:21 -060017302
17303 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017304 VkImage srcImage;
17305 VkImage dstImage;
17306 VkDeviceMemory srcMem;
17307 VkDeviceMemory destMem;
17308 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017309
17310 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017311 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17312 image_create_info.pNext = NULL;
17313 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017314 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017315 image_create_info.extent.width = 32;
17316 image_create_info.extent.height = 32;
17317 image_create_info.extent.depth = 1;
17318 image_create_info.mipLevels = 1;
17319 image_create_info.arrayLayers = 1;
17320 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060017321 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070017322 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17323 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017324 VkFormatProperties properties;
17325 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17326 if (properties.optimalTilingFeatures == 0) {
17327 printf(" Image format not supported; skipped.\n");
17328 return;
17329 }
Mike Stroyana3082432015-09-25 13:39:21 -060017330
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017331 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017332 ASSERT_VK_SUCCESS(err);
17333
Karl Schultzbdb75952016-04-19 11:36:49 -060017334 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17335
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017336 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017337 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017338 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017339 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017340
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017341 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017342 ASSERT_VK_SUCCESS(err);
17343
17344 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017345 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017346 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17347 memAlloc.pNext = NULL;
17348 memAlloc.allocationSize = 0;
17349 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017350
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017351 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017352 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017353 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017354 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017355 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017356 ASSERT_VK_SUCCESS(err);
17357
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017358 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017359 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017360 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017361 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017362 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017363 ASSERT_VK_SUCCESS(err);
17364
17365 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17366 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017367 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017368 ASSERT_VK_SUCCESS(err);
17369
Tony Barbour552f6c02016-12-21 14:34:07 -070017370 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017371 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017372 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017373 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017374 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017375 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017376 copyRegion.srcOffset.x = 0;
17377 copyRegion.srcOffset.y = 0;
17378 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017379 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017380 copyRegion.dstSubresource.mipLevel = 0;
17381 copyRegion.dstSubresource.baseArrayLayer = 0;
17382 copyRegion.dstSubresource.layerCount = 0;
17383 copyRegion.dstOffset.x = 0;
17384 copyRegion.dstOffset.y = 0;
17385 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017386 copyRegion.extent.width = 1;
17387 copyRegion.extent.height = 1;
17388 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017389 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017390 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017391
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017392 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017393
Chia-I Wuf7458c52015-10-26 21:10:41 +080017394 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017395 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017396 vkFreeMemory(m_device->device(), srcMem, NULL);
17397 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017398}
17399
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017400TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17401 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017402
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017403 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017404
17405 VkImageFormatProperties image_format_properties;
17406 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17407 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17408 &image_format_properties);
17409
17410 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17411 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17412 printf(" Image multi-sample support not found; skipped.\n");
17413 return;
17414 }
17415
17416 VkImageCreateInfo ci;
17417 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17418 ci.pNext = NULL;
17419 ci.flags = 0;
17420 ci.imageType = VK_IMAGE_TYPE_2D;
17421 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17422 ci.extent = {128, 128, 1};
17423 ci.mipLevels = 1;
17424 ci.arrayLayers = 1;
17425 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17426 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17427 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17428 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17429 ci.queueFamilyIndexCount = 0;
17430 ci.pQueueFamilyIndices = NULL;
17431 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17432
17433 VkImageObj image1(m_device);
17434 image1.init(&ci);
17435 ASSERT_TRUE(image1.initialized());
17436
17437 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17438 VkImageObj image2(m_device);
17439 image2.init(&ci);
17440 ASSERT_TRUE(image2.initialized());
17441
17442 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17443 VkImageObj image4(m_device);
17444 image4.init(&ci);
17445 ASSERT_TRUE(image4.initialized());
17446
17447 m_commandBuffer->BeginCommandBuffer();
17448
17449 VkImageCopy copyRegion;
17450 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17451 copyRegion.srcSubresource.mipLevel = 0;
17452 copyRegion.srcSubresource.baseArrayLayer = 0;
17453 copyRegion.srcSubresource.layerCount = 1;
17454 copyRegion.srcOffset = {0, 0, 0};
17455 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17456 copyRegion.dstSubresource.mipLevel = 0;
17457 copyRegion.dstSubresource.baseArrayLayer = 0;
17458 copyRegion.dstSubresource.layerCount = 1;
17459 copyRegion.dstOffset = {0, 0, 0};
17460 copyRegion.extent = {128, 128, 1};
17461
17462 // Copy a single sample image to/from a multi-sample image
17463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17464 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17465 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17466 m_errorMonitor->VerifyFound();
17467
17468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17469 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17470 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17471 m_errorMonitor->VerifyFound();
17472
17473 // Copy between multi-sample images with different sample counts
17474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17475 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17476 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17477 m_errorMonitor->VerifyFound();
17478
17479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17480 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17481 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17482 m_errorMonitor->VerifyFound();
17483
17484 m_commandBuffer->EndCommandBuffer();
17485}
17486
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017487TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17488 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017489 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017490 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017491 if (!ds_format) {
17492 return;
17493 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017494
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017495 VkFormatProperties properties;
17496 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
17497 if (properties.optimalTilingFeatures == 0) {
17498 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
17499 return;
17500 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017501 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017502 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 -060017503 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 -060017504 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017505 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17506 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017507 ASSERT_TRUE(color_image.initialized());
17508 ASSERT_TRUE(depth_image.initialized());
17509 ASSERT_TRUE(ds_image.initialized());
17510
17511 VkImageCopy copyRegion;
17512 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17513 copyRegion.srcSubresource.mipLevel = 0;
17514 copyRegion.srcSubresource.baseArrayLayer = 0;
17515 copyRegion.srcSubresource.layerCount = 1;
17516 copyRegion.srcOffset = {0, 0, 0};
17517 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17518 copyRegion.dstSubresource.mipLevel = 0;
17519 copyRegion.dstSubresource.baseArrayLayer = 0;
17520 copyRegion.dstSubresource.layerCount = 1;
17521 copyRegion.dstOffset = {64, 0, 0};
17522 copyRegion.extent = {64, 128, 1};
17523
17524 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17526 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17527 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17528 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017529 m_errorMonitor->VerifyFound();
17530
17531 m_commandBuffer->BeginCommandBuffer();
17532
17533 // Src and dest aspect masks don't match
17534 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017536 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17537 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017538 m_errorMonitor->VerifyFound();
17539 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17540
17541 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017542 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017543 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17545 // These aspect/format mismatches are redundant but unavoidable here
17546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017548 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17549 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017550 m_errorMonitor->VerifyFound();
17551 // Metadata aspect is illegal - VU 01222
17552 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17553 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17555 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017556 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17557 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017558 m_errorMonitor->VerifyFound();
17559
17560 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17561 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17562
17563 // Aspect mask doesn't match source image format - VU 01200
17564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17565 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17567 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17568 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17569 m_errorMonitor->VerifyFound();
17570
17571 // Aspect mask doesn't match dest image format - VU 01201
17572 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17573 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17575 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17577 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17578 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17579 m_errorMonitor->VerifyFound();
17580
17581 m_commandBuffer->EndCommandBuffer();
17582}
17583
Karl Schultz6addd812016-02-02 17:17:23 -070017584TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17585 VkResult err;
17586 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017587
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17589 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017590
Tony Barbour1fa09702017-03-16 12:09:08 -060017591 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017592
17593 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017594 VkImage srcImage;
17595 VkImage dstImage;
17596 VkDeviceMemory srcMem;
17597 VkDeviceMemory destMem;
17598 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017599
17600 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017601 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17602 image_create_info.pNext = NULL;
17603 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17604 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17605 image_create_info.extent.width = 32;
17606 image_create_info.extent.height = 1;
17607 image_create_info.extent.depth = 1;
17608 image_create_info.mipLevels = 1;
17609 image_create_info.arrayLayers = 1;
17610 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17611 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17612 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17613 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017614
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017615 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017616 ASSERT_VK_SUCCESS(err);
17617
Karl Schultz6addd812016-02-02 17:17:23 -070017618 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017619
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017620 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017621 ASSERT_VK_SUCCESS(err);
17622
17623 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017624 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017625 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17626 memAlloc.pNext = NULL;
17627 memAlloc.allocationSize = 0;
17628 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017629
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017630 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017631 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017632 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017633 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017634 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017635 ASSERT_VK_SUCCESS(err);
17636
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017637 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017638 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017639 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017640 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017641 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017642 ASSERT_VK_SUCCESS(err);
17643
17644 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17645 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017646 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017647 ASSERT_VK_SUCCESS(err);
17648
Tony Barbour552f6c02016-12-21 14:34:07 -070017649 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017650 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017651 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17652 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017653 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017654 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017655 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017656 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017657 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017658 resolveRegion.srcOffset.x = 0;
17659 resolveRegion.srcOffset.y = 0;
17660 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017661 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017662 resolveRegion.dstSubresource.mipLevel = 0;
17663 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017664 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017665 resolveRegion.dstOffset.x = 0;
17666 resolveRegion.dstOffset.y = 0;
17667 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017668 resolveRegion.extent.width = 1;
17669 resolveRegion.extent.height = 1;
17670 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017671 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017672 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017673
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017674 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017675
Chia-I Wuf7458c52015-10-26 21:10:41 +080017676 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017677 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017678 vkFreeMemory(m_device->device(), srcMem, NULL);
17679 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017680}
17681
Karl Schultz6addd812016-02-02 17:17:23 -070017682TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17683 VkResult err;
17684 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017685
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17687 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017688
Tony Barbour1fa09702017-03-16 12:09:08 -060017689 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017690
Chris Forbesa7530692016-05-08 12:35:39 +120017691 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017692 VkImage srcImage;
17693 VkImage dstImage;
17694 VkDeviceMemory srcMem;
17695 VkDeviceMemory destMem;
17696 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017697
17698 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017699 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17700 image_create_info.pNext = NULL;
17701 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17702 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17703 image_create_info.extent.width = 32;
17704 image_create_info.extent.height = 1;
17705 image_create_info.extent.depth = 1;
17706 image_create_info.mipLevels = 1;
17707 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017708 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017709 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17710 // Note: Some implementations expect color attachment usage for any
17711 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017712 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017713 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017714
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017715 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017716 ASSERT_VK_SUCCESS(err);
17717
Karl Schultz6addd812016-02-02 17:17:23 -070017718 // Note: Some implementations expect color attachment usage for any
17719 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017720 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017721
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017722 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017723 ASSERT_VK_SUCCESS(err);
17724
17725 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017726 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017727 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17728 memAlloc.pNext = NULL;
17729 memAlloc.allocationSize = 0;
17730 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017731
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017732 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017733 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017734 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017735 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017736 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017737 ASSERT_VK_SUCCESS(err);
17738
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017739 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017740 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017741 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017742 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017743 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017744 ASSERT_VK_SUCCESS(err);
17745
17746 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17747 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017748 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017749 ASSERT_VK_SUCCESS(err);
17750
Tony Barbour552f6c02016-12-21 14:34:07 -070017751 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017752 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017753 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17754 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017755 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017756 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017757 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017758 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017759 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017760 resolveRegion.srcOffset.x = 0;
17761 resolveRegion.srcOffset.y = 0;
17762 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017763 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017764 resolveRegion.dstSubresource.mipLevel = 0;
17765 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017766 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017767 resolveRegion.dstOffset.x = 0;
17768 resolveRegion.dstOffset.y = 0;
17769 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017770 resolveRegion.extent.width = 1;
17771 resolveRegion.extent.height = 1;
17772 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017773 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017774 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017775
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017776 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017777
Chia-I Wuf7458c52015-10-26 21:10:41 +080017778 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017779 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017780 vkFreeMemory(m_device->device(), srcMem, NULL);
17781 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017782}
17783
Karl Schultz6addd812016-02-02 17:17:23 -070017784TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17785 VkResult err;
17786 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017787
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017789 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017790
Tony Barbour1fa09702017-03-16 12:09:08 -060017791 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017792
17793 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017794 VkImage srcImage;
17795 VkImage dstImage;
17796 VkDeviceMemory srcMem;
17797 VkDeviceMemory destMem;
17798 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017799
17800 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017801 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17802 image_create_info.pNext = NULL;
17803 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17804 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17805 image_create_info.extent.width = 32;
17806 image_create_info.extent.height = 1;
17807 image_create_info.extent.depth = 1;
17808 image_create_info.mipLevels = 1;
17809 image_create_info.arrayLayers = 1;
17810 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17811 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17812 // Note: Some implementations expect color attachment usage for any
17813 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017814 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017815 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017816
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017817 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017818 ASSERT_VK_SUCCESS(err);
17819
Karl Schultz6addd812016-02-02 17:17:23 -070017820 // Set format to something other than source image
17821 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17822 // Note: Some implementations expect color attachment usage for any
17823 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017824 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017825 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017826
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017827 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017828 ASSERT_VK_SUCCESS(err);
17829
17830 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017831 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017832 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17833 memAlloc.pNext = NULL;
17834 memAlloc.allocationSize = 0;
17835 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017836
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017837 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017838 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017839 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017840 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017841 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017842 ASSERT_VK_SUCCESS(err);
17843
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017844 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017845 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017846 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017847 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017848 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017849 ASSERT_VK_SUCCESS(err);
17850
17851 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17852 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017853 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017854 ASSERT_VK_SUCCESS(err);
17855
Tony Barbour552f6c02016-12-21 14:34:07 -070017856 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017857 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017858 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17859 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017860 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017861 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017862 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017863 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017864 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017865 resolveRegion.srcOffset.x = 0;
17866 resolveRegion.srcOffset.y = 0;
17867 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017868 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017869 resolveRegion.dstSubresource.mipLevel = 0;
17870 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017871 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017872 resolveRegion.dstOffset.x = 0;
17873 resolveRegion.dstOffset.y = 0;
17874 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017875 resolveRegion.extent.width = 1;
17876 resolveRegion.extent.height = 1;
17877 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017878 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017879 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017880
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017881 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017882
Chia-I Wuf7458c52015-10-26 21:10:41 +080017883 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017884 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017885 vkFreeMemory(m_device->device(), srcMem, NULL);
17886 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017887}
17888
Karl Schultz6addd812016-02-02 17:17:23 -070017889TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17890 VkResult err;
17891 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017892
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017894 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017895
Tony Barbour1fa09702017-03-16 12:09:08 -060017896 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017897
17898 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017899 VkImage srcImage;
17900 VkImage dstImage;
17901 VkDeviceMemory srcMem;
17902 VkDeviceMemory destMem;
17903 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017904
17905 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017906 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17907 image_create_info.pNext = NULL;
17908 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17909 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17910 image_create_info.extent.width = 32;
17911 image_create_info.extent.height = 1;
17912 image_create_info.extent.depth = 1;
17913 image_create_info.mipLevels = 1;
17914 image_create_info.arrayLayers = 1;
17915 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17916 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17917 // Note: Some implementations expect color attachment usage for any
17918 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017919 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017920 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017921
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017922 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017923 ASSERT_VK_SUCCESS(err);
17924
Karl Schultz6addd812016-02-02 17:17:23 -070017925 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17926 // Note: Some implementations expect color attachment usage for any
17927 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017928 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017929 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017930
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017931 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017932 ASSERT_VK_SUCCESS(err);
17933
17934 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017935 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017936 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17937 memAlloc.pNext = NULL;
17938 memAlloc.allocationSize = 0;
17939 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017940
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017941 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017942 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017943 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017944 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017945 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017946 ASSERT_VK_SUCCESS(err);
17947
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017948 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017949 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017950 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017951 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017952 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017953 ASSERT_VK_SUCCESS(err);
17954
17955 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17956 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017957 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017958 ASSERT_VK_SUCCESS(err);
17959
Tony Barbour552f6c02016-12-21 14:34:07 -070017960 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017961 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017962 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17963 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017964 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017965 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017966 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017967 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017968 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017969 resolveRegion.srcOffset.x = 0;
17970 resolveRegion.srcOffset.y = 0;
17971 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017972 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017973 resolveRegion.dstSubresource.mipLevel = 0;
17974 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017975 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017976 resolveRegion.dstOffset.x = 0;
17977 resolveRegion.dstOffset.y = 0;
17978 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017979 resolveRegion.extent.width = 1;
17980 resolveRegion.extent.height = 1;
17981 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017982 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017983 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017984
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017985 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017986
Chia-I Wuf7458c52015-10-26 21:10:41 +080017987 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017988 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017989 vkFreeMemory(m_device->device(), srcMem, NULL);
17990 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017991}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017992
Karl Schultz6addd812016-02-02 17:17:23 -070017993TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017994 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017995 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17996 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017997 // The image format check comes 2nd in validation so we trigger it first,
17998 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017999 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018000
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18002 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018003
Tony Barbour1fa09702017-03-16 12:09:08 -060018004 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018005 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018006 if (!depth_format) {
18007 return;
18008 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018009
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018010 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018011 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18012 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018013
18014 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018015 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18016 ds_pool_ci.pNext = NULL;
18017 ds_pool_ci.maxSets = 1;
18018 ds_pool_ci.poolSizeCount = 1;
18019 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018020
18021 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018022 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018023 ASSERT_VK_SUCCESS(err);
18024
18025 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018026 dsl_binding.binding = 0;
18027 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18028 dsl_binding.descriptorCount = 1;
18029 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18030 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018031
18032 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018033 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18034 ds_layout_ci.pNext = NULL;
18035 ds_layout_ci.bindingCount = 1;
18036 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018037 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018038 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018039 ASSERT_VK_SUCCESS(err);
18040
18041 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018042 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018043 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018044 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018045 alloc_info.descriptorPool = ds_pool;
18046 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018047 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018048 ASSERT_VK_SUCCESS(err);
18049
Karl Schultz6addd812016-02-02 17:17:23 -070018050 VkImage image_bad;
18051 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018052 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018053 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018054 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018055 const int32_t tex_width = 32;
18056 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018057
18058 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018059 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18060 image_create_info.pNext = NULL;
18061 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18062 image_create_info.format = tex_format_bad;
18063 image_create_info.extent.width = tex_width;
18064 image_create_info.extent.height = tex_height;
18065 image_create_info.extent.depth = 1;
18066 image_create_info.mipLevels = 1;
18067 image_create_info.arrayLayers = 1;
18068 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18069 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018070 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018071 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018072
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018073 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018074 ASSERT_VK_SUCCESS(err);
18075 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018076 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18077 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018078 ASSERT_VK_SUCCESS(err);
18079
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018080 // ---Bind image memory---
18081 VkMemoryRequirements img_mem_reqs;
18082 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18083 VkMemoryAllocateInfo image_alloc_info = {};
18084 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18085 image_alloc_info.pNext = NULL;
18086 image_alloc_info.memoryTypeIndex = 0;
18087 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018088 bool pass =
18089 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 -070018090 ASSERT_TRUE(pass);
18091 VkDeviceMemory mem;
18092 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18093 ASSERT_VK_SUCCESS(err);
18094 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18095 ASSERT_VK_SUCCESS(err);
18096 // -----------------------
18097
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018098 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018099 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018100 image_view_create_info.image = image_bad;
18101 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18102 image_view_create_info.format = tex_format_bad;
18103 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18104 image_view_create_info.subresourceRange.baseMipLevel = 0;
18105 image_view_create_info.subresourceRange.layerCount = 1;
18106 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018107 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018108
18109 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018110 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018111
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018112 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018113
Chia-I Wuf7458c52015-10-26 21:10:41 +080018114 vkDestroyImage(m_device->device(), image_bad, NULL);
18115 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018116 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18117 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018118
18119 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018120}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018121
18122TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018123 TEST_DESCRIPTION(
18124 "Call ClearColorImage w/ a depth|stencil image and "
18125 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018126
Tony Barbour1fa09702017-03-16 12:09:08 -060018127 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018128 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018129 if (!depth_format) {
18130 return;
18131 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018132 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18133
Tony Barbour552f6c02016-12-21 14:34:07 -070018134 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018135
18136 // Color image
18137 VkClearColorValue clear_color;
18138 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18139 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18140 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18141 const int32_t img_width = 32;
18142 const int32_t img_height = 32;
18143 VkImageCreateInfo image_create_info = {};
18144 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18145 image_create_info.pNext = NULL;
18146 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18147 image_create_info.format = color_format;
18148 image_create_info.extent.width = img_width;
18149 image_create_info.extent.height = img_height;
18150 image_create_info.extent.depth = 1;
18151 image_create_info.mipLevels = 1;
18152 image_create_info.arrayLayers = 1;
18153 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18154 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18155 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18156
18157 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018158 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018159
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018160 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018161
18162 // Depth/Stencil image
18163 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018164 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018165 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18166 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018167 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018168 ds_image_create_info.extent.width = 64;
18169 ds_image_create_info.extent.height = 64;
18170 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018171 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 -060018172
18173 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018174 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018175
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018176 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 -060018177
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018179
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018180 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018181 &color_range);
18182
18183 m_errorMonitor->VerifyFound();
18184
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18186 "vkCmdClearColorImage called with "
18187 "image created without "
18188 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018189
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018190 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018191 &color_range);
18192
18193 m_errorMonitor->VerifyFound();
18194
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018195 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18197 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018198
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018199 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18200 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018201
18202 m_errorMonitor->VerifyFound();
18203}
Tobin Ehliscde08892015-09-22 10:11:37 -060018204
Mike Schuchardt35fece12017-03-07 14:40:28 -070018205TEST_F(VkLayerTest, CommandQueueFlags) {
18206 TEST_DESCRIPTION(
18207 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18208 "graphics-only command");
18209
18210 ASSERT_NO_FATAL_FAILURE(Init());
18211
18212 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018213 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018214 printf(" Non-graphics queue family not found; skipped.\n");
18215 return;
18216 } else {
18217 // Create command pool on a non-graphics queue
18218 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18219
18220 // Setup command buffer on pool
18221 VkCommandBufferObj command_buffer(m_device, &command_pool);
18222 command_buffer.BeginCommandBuffer();
18223
18224 // Issue a graphics only command
18225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18226 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18227 command_buffer.SetViewport(0, 1, &viewport);
18228 m_errorMonitor->VerifyFound();
18229 }
18230}
18231
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018232// WSI Enabled Tests
18233//
Chris Forbes09368e42016-10-13 11:59:22 +130018234#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018235TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18236
18237#if defined(VK_USE_PLATFORM_XCB_KHR)
18238 VkSurfaceKHR surface = VK_NULL_HANDLE;
18239
18240 VkResult err;
18241 bool pass;
18242 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18243 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18244 // uint32_t swapchain_image_count = 0;
18245 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18246 // uint32_t image_index = 0;
18247 // VkPresentInfoKHR present_info = {};
18248
Tony Barbour1fa09702017-03-16 12:09:08 -060018249 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018250
18251 // Use the create function from one of the VK_KHR_*_surface extension in
18252 // order to create a surface, testing all known errors in the process,
18253 // before successfully creating a surface:
18254 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18256 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18257 pass = (err != VK_SUCCESS);
18258 ASSERT_TRUE(pass);
18259 m_errorMonitor->VerifyFound();
18260
18261 // Next, try to create a surface with the wrong
18262 // VkXcbSurfaceCreateInfoKHR::sType:
18263 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18264 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18266 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18267 pass = (err != VK_SUCCESS);
18268 ASSERT_TRUE(pass);
18269 m_errorMonitor->VerifyFound();
18270
18271 // Create a native window, and then correctly create a surface:
18272 xcb_connection_t *connection;
18273 xcb_screen_t *screen;
18274 xcb_window_t xcb_window;
18275 xcb_intern_atom_reply_t *atom_wm_delete_window;
18276
18277 const xcb_setup_t *setup;
18278 xcb_screen_iterator_t iter;
18279 int scr;
18280 uint32_t value_mask, value_list[32];
18281 int width = 1;
18282 int height = 1;
18283
18284 connection = xcb_connect(NULL, &scr);
18285 ASSERT_TRUE(connection != NULL);
18286 setup = xcb_get_setup(connection);
18287 iter = xcb_setup_roots_iterator(setup);
18288 while (scr-- > 0)
18289 xcb_screen_next(&iter);
18290 screen = iter.data;
18291
18292 xcb_window = xcb_generate_id(connection);
18293
18294 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18295 value_list[0] = screen->black_pixel;
18296 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18297
18298 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18299 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18300
18301 /* Magic code that will send notification when window is destroyed */
18302 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18303 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18304
18305 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18306 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18307 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18308 free(reply);
18309
18310 xcb_map_window(connection, xcb_window);
18311
18312 // Force the x/y coordinates to 100,100 results are identical in consecutive
18313 // runs
18314 const uint32_t coords[] = { 100, 100 };
18315 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18316
18317 // Finally, try to correctly create a surface:
18318 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18319 xcb_create_info.pNext = NULL;
18320 xcb_create_info.flags = 0;
18321 xcb_create_info.connection = connection;
18322 xcb_create_info.window = xcb_window;
18323 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18324 pass = (err == VK_SUCCESS);
18325 ASSERT_TRUE(pass);
18326
18327 // Check if surface supports presentation:
18328
18329 // 1st, do so without having queried the queue families:
18330 VkBool32 supported = false;
18331 // TODO: Get the following error to come out:
18332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18333 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18334 "function");
18335 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18336 pass = (err != VK_SUCCESS);
18337 // ASSERT_TRUE(pass);
18338 // m_errorMonitor->VerifyFound();
18339
18340 // Next, query a queue family index that's too large:
18341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18342 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18343 pass = (err != VK_SUCCESS);
18344 ASSERT_TRUE(pass);
18345 m_errorMonitor->VerifyFound();
18346
18347 // Finally, do so correctly:
18348 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18349 // SUPPORTED
18350 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18351 pass = (err == VK_SUCCESS);
18352 ASSERT_TRUE(pass);
18353
18354 // Before proceeding, try to create a swapchain without having called
18355 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18356 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18357 swapchain_create_info.pNext = NULL;
18358 swapchain_create_info.flags = 0;
18359 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18360 swapchain_create_info.surface = surface;
18361 swapchain_create_info.imageArrayLayers = 1;
18362 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18363 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18365 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18366 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18367 pass = (err != VK_SUCCESS);
18368 ASSERT_TRUE(pass);
18369 m_errorMonitor->VerifyFound();
18370
18371 // Get the surface capabilities:
18372 VkSurfaceCapabilitiesKHR surface_capabilities;
18373
18374 // Do so correctly (only error logged by this entrypoint is if the
18375 // extension isn't enabled):
18376 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18377 pass = (err == VK_SUCCESS);
18378 ASSERT_TRUE(pass);
18379
18380 // Get the surface formats:
18381 uint32_t surface_format_count;
18382
18383 // First, try without a pointer to surface_format_count:
18384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18385 "specified as NULL");
18386 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18387 pass = (err == VK_SUCCESS);
18388 ASSERT_TRUE(pass);
18389 m_errorMonitor->VerifyFound();
18390
18391 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18392 // correctly done a 1st try (to get the count):
18393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18394 surface_format_count = 0;
18395 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18396 pass = (err == VK_SUCCESS);
18397 ASSERT_TRUE(pass);
18398 m_errorMonitor->VerifyFound();
18399
18400 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18401 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18402 pass = (err == VK_SUCCESS);
18403 ASSERT_TRUE(pass);
18404
18405 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18406 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18407
18408 // Next, do a 2nd try with surface_format_count being set too high:
18409 surface_format_count += 5;
18410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18411 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18412 pass = (err == VK_SUCCESS);
18413 ASSERT_TRUE(pass);
18414 m_errorMonitor->VerifyFound();
18415
18416 // Finally, do a correct 1st and 2nd try:
18417 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18418 pass = (err == VK_SUCCESS);
18419 ASSERT_TRUE(pass);
18420 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18421 pass = (err == VK_SUCCESS);
18422 ASSERT_TRUE(pass);
18423
18424 // Get the surface present modes:
18425 uint32_t surface_present_mode_count;
18426
18427 // First, try without a pointer to surface_format_count:
18428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18429 "specified as NULL");
18430
18431 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18432 pass = (err == VK_SUCCESS);
18433 ASSERT_TRUE(pass);
18434 m_errorMonitor->VerifyFound();
18435
18436 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18437 // correctly done a 1st try (to get the count):
18438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18439 surface_present_mode_count = 0;
18440 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18441 (VkPresentModeKHR *)&surface_present_mode_count);
18442 pass = (err == VK_SUCCESS);
18443 ASSERT_TRUE(pass);
18444 m_errorMonitor->VerifyFound();
18445
18446 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18447 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18448 pass = (err == VK_SUCCESS);
18449 ASSERT_TRUE(pass);
18450
18451 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18452 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18453
18454 // Next, do a 2nd try with surface_format_count being set too high:
18455 surface_present_mode_count += 5;
18456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18457 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18458 pass = (err == VK_SUCCESS);
18459 ASSERT_TRUE(pass);
18460 m_errorMonitor->VerifyFound();
18461
18462 // Finally, do a correct 1st and 2nd try:
18463 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18464 pass = (err == VK_SUCCESS);
18465 ASSERT_TRUE(pass);
18466 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18467 pass = (err == VK_SUCCESS);
18468 ASSERT_TRUE(pass);
18469
18470 // Create a swapchain:
18471
18472 // First, try without a pointer to swapchain_create_info:
18473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18474 "specified as NULL");
18475
18476 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18477 pass = (err != VK_SUCCESS);
18478 ASSERT_TRUE(pass);
18479 m_errorMonitor->VerifyFound();
18480
18481 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18482 // sType:
18483 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18485
18486 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18487 pass = (err != VK_SUCCESS);
18488 ASSERT_TRUE(pass);
18489 m_errorMonitor->VerifyFound();
18490
18491 // Next, call with a NULL swapchain pointer:
18492 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18493 swapchain_create_info.pNext = NULL;
18494 swapchain_create_info.flags = 0;
18495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18496 "specified as NULL");
18497
18498 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18499 pass = (err != VK_SUCCESS);
18500 ASSERT_TRUE(pass);
18501 m_errorMonitor->VerifyFound();
18502
18503 // TODO: Enhance swapchain layer so that
18504 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18505
18506 // Next, call with a queue family index that's too large:
18507 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18508 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18509 swapchain_create_info.queueFamilyIndexCount = 2;
18510 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18512 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18513 pass = (err != VK_SUCCESS);
18514 ASSERT_TRUE(pass);
18515 m_errorMonitor->VerifyFound();
18516
18517 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18518 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18519 swapchain_create_info.queueFamilyIndexCount = 1;
18520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18521 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18522 "pCreateInfo->pQueueFamilyIndices).");
18523 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18524 pass = (err != VK_SUCCESS);
18525 ASSERT_TRUE(pass);
18526 m_errorMonitor->VerifyFound();
18527
18528 // Next, call with an invalid imageSharingMode:
18529 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18530 swapchain_create_info.queueFamilyIndexCount = 1;
18531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18532 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18533 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18534 pass = (err != VK_SUCCESS);
18535 ASSERT_TRUE(pass);
18536 m_errorMonitor->VerifyFound();
18537 // Fix for the future:
18538 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18539 // SUPPORTED
18540 swapchain_create_info.queueFamilyIndexCount = 0;
18541 queueFamilyIndex[0] = 0;
18542 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18543
18544 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18545 // Get the images from a swapchain:
18546 // Acquire an image from a swapchain:
18547 // Present an image to a swapchain:
18548 // Destroy the swapchain:
18549
18550 // TODOs:
18551 //
18552 // - Try destroying the device without first destroying the swapchain
18553 //
18554 // - Try destroying the device without first destroying the surface
18555 //
18556 // - Try destroying the surface without first destroying the swapchain
18557
18558 // Destroy the surface:
18559 vkDestroySurfaceKHR(instance(), surface, NULL);
18560
18561 // Tear down the window:
18562 xcb_destroy_window(connection, xcb_window);
18563 xcb_disconnect(connection);
18564
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018565#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018566 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018567#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018568}
Chris Forbes09368e42016-10-13 11:59:22 +130018569#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018570
18571//
18572// POSITIVE VALIDATION TESTS
18573//
18574// These tests do not expect to encounter ANY validation errors pass only if this is true
18575
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018576TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18577 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018578 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018579 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18580
18581 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18582 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018583 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018584 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18585 command_buffer_allocate_info.commandBufferCount = 1;
18586
18587 VkCommandBuffer secondary_command_buffer;
18588 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18589 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18590 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18591 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18592 command_buffer_inheritance_info.renderPass = m_renderPass;
18593 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18594
18595 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18596 command_buffer_begin_info.flags =
18597 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18598 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18599
18600 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18601 VkClearAttachment color_attachment;
18602 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18603 color_attachment.clearValue.color.float32[0] = 0;
18604 color_attachment.clearValue.color.float32[1] = 0;
18605 color_attachment.clearValue.color.float32[2] = 0;
18606 color_attachment.clearValue.color.float32[3] = 0;
18607 color_attachment.colorAttachment = 0;
18608 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18609 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18610}
18611
Tobin Ehlise0006882016-11-03 10:14:28 -060018612TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018613 TEST_DESCRIPTION(
18614 "Perform an image layout transition in a secondary command buffer followed "
18615 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018616 VkResult err;
18617 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018618 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018619 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018620 if (!depth_format) {
18621 return;
18622 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018623 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18624 // Allocate a secondary and primary cmd buffer
18625 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18626 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018627 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018628 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18629 command_buffer_allocate_info.commandBufferCount = 1;
18630
18631 VkCommandBuffer secondary_command_buffer;
18632 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18633 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18634 VkCommandBuffer primary_command_buffer;
18635 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18636 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18637 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18638 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18639 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18640 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18641 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18642
18643 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18644 ASSERT_VK_SUCCESS(err);
18645 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018646 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 -060018647 ASSERT_TRUE(image.initialized());
18648 VkImageMemoryBarrier img_barrier = {};
18649 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18650 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18651 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18652 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18653 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18654 img_barrier.image = image.handle();
18655 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18656 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18657 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18658 img_barrier.subresourceRange.baseArrayLayer = 0;
18659 img_barrier.subresourceRange.baseMipLevel = 0;
18660 img_barrier.subresourceRange.layerCount = 1;
18661 img_barrier.subresourceRange.levelCount = 1;
18662 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18663 0, nullptr, 1, &img_barrier);
18664 err = vkEndCommandBuffer(secondary_command_buffer);
18665 ASSERT_VK_SUCCESS(err);
18666
18667 // Now update primary cmd buffer to execute secondary and transitions image
18668 command_buffer_begin_info.pInheritanceInfo = nullptr;
18669 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18670 ASSERT_VK_SUCCESS(err);
18671 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18672 VkImageMemoryBarrier img_barrier2 = {};
18673 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18674 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18675 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18676 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18677 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18678 img_barrier2.image = image.handle();
18679 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18680 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18681 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18682 img_barrier2.subresourceRange.baseArrayLayer = 0;
18683 img_barrier2.subresourceRange.baseMipLevel = 0;
18684 img_barrier2.subresourceRange.layerCount = 1;
18685 img_barrier2.subresourceRange.levelCount = 1;
18686 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18687 nullptr, 1, &img_barrier2);
18688 err = vkEndCommandBuffer(primary_command_buffer);
18689 ASSERT_VK_SUCCESS(err);
18690 VkSubmitInfo submit_info = {};
18691 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18692 submit_info.commandBufferCount = 1;
18693 submit_info.pCommandBuffers = &primary_command_buffer;
18694 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18695 ASSERT_VK_SUCCESS(err);
18696 m_errorMonitor->VerifyNotFound();
18697 err = vkDeviceWaitIdle(m_device->device());
18698 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018699 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18700 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018701}
18702
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018703// This is a positive test. No failures are expected.
18704TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018705 TEST_DESCRIPTION(
18706 "Ensure that the vkUpdateDescriptorSets validation code "
18707 "is ignoring VkWriteDescriptorSet members that are not "
18708 "related to the descriptor type specified by "
18709 "VkWriteDescriptorSet::descriptorType. Correct "
18710 "validation behavior will result in the test running to "
18711 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018712
18713 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18714
Tony Barbour1fa09702017-03-16 12:09:08 -060018715 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018716
18717 // Image Case
18718 {
18719 m_errorMonitor->ExpectSuccess();
18720
18721 VkImage image;
18722 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18723 const int32_t tex_width = 32;
18724 const int32_t tex_height = 32;
18725 VkImageCreateInfo image_create_info = {};
18726 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18727 image_create_info.pNext = NULL;
18728 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18729 image_create_info.format = tex_format;
18730 image_create_info.extent.width = tex_width;
18731 image_create_info.extent.height = tex_height;
18732 image_create_info.extent.depth = 1;
18733 image_create_info.mipLevels = 1;
18734 image_create_info.arrayLayers = 1;
18735 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18736 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18737 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18738 image_create_info.flags = 0;
18739 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18740 ASSERT_VK_SUCCESS(err);
18741
18742 VkMemoryRequirements memory_reqs;
18743 VkDeviceMemory image_memory;
18744 bool pass;
18745 VkMemoryAllocateInfo memory_info = {};
18746 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18747 memory_info.pNext = NULL;
18748 memory_info.allocationSize = 0;
18749 memory_info.memoryTypeIndex = 0;
18750 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18751 memory_info.allocationSize = memory_reqs.size;
18752 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18753 ASSERT_TRUE(pass);
18754 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18755 ASSERT_VK_SUCCESS(err);
18756 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18757 ASSERT_VK_SUCCESS(err);
18758
18759 VkImageViewCreateInfo image_view_create_info = {};
18760 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18761 image_view_create_info.image = image;
18762 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18763 image_view_create_info.format = tex_format;
18764 image_view_create_info.subresourceRange.layerCount = 1;
18765 image_view_create_info.subresourceRange.baseMipLevel = 0;
18766 image_view_create_info.subresourceRange.levelCount = 1;
18767 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18768
18769 VkImageView view;
18770 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18771 ASSERT_VK_SUCCESS(err);
18772
18773 VkDescriptorPoolSize ds_type_count = {};
18774 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18775 ds_type_count.descriptorCount = 1;
18776
18777 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18778 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18779 ds_pool_ci.pNext = NULL;
18780 ds_pool_ci.maxSets = 1;
18781 ds_pool_ci.poolSizeCount = 1;
18782 ds_pool_ci.pPoolSizes = &ds_type_count;
18783
18784 VkDescriptorPool ds_pool;
18785 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18786 ASSERT_VK_SUCCESS(err);
18787
18788 VkDescriptorSetLayoutBinding dsl_binding = {};
18789 dsl_binding.binding = 0;
18790 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18791 dsl_binding.descriptorCount = 1;
18792 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18793 dsl_binding.pImmutableSamplers = NULL;
18794
18795 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18796 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18797 ds_layout_ci.pNext = NULL;
18798 ds_layout_ci.bindingCount = 1;
18799 ds_layout_ci.pBindings = &dsl_binding;
18800 VkDescriptorSetLayout ds_layout;
18801 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18802 ASSERT_VK_SUCCESS(err);
18803
18804 VkDescriptorSet descriptor_set;
18805 VkDescriptorSetAllocateInfo alloc_info = {};
18806 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18807 alloc_info.descriptorSetCount = 1;
18808 alloc_info.descriptorPool = ds_pool;
18809 alloc_info.pSetLayouts = &ds_layout;
18810 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18811 ASSERT_VK_SUCCESS(err);
18812
18813 VkDescriptorImageInfo image_info = {};
18814 image_info.imageView = view;
18815 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18816
18817 VkWriteDescriptorSet descriptor_write;
18818 memset(&descriptor_write, 0, sizeof(descriptor_write));
18819 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18820 descriptor_write.dstSet = descriptor_set;
18821 descriptor_write.dstBinding = 0;
18822 descriptor_write.descriptorCount = 1;
18823 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18824 descriptor_write.pImageInfo = &image_info;
18825
18826 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18827 // be
18828 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18829 // This will most likely produce a crash if the parameter_validation
18830 // layer
18831 // does not correctly ignore pBufferInfo.
18832 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18833 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18834
18835 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18836
18837 m_errorMonitor->VerifyNotFound();
18838
18839 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18840 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18841 vkDestroyImageView(m_device->device(), view, NULL);
18842 vkDestroyImage(m_device->device(), image, NULL);
18843 vkFreeMemory(m_device->device(), image_memory, NULL);
18844 }
18845
18846 // Buffer Case
18847 {
18848 m_errorMonitor->ExpectSuccess();
18849
18850 VkBuffer buffer;
18851 uint32_t queue_family_index = 0;
18852 VkBufferCreateInfo buffer_create_info = {};
18853 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18854 buffer_create_info.size = 1024;
18855 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18856 buffer_create_info.queueFamilyIndexCount = 1;
18857 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18858
18859 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18860 ASSERT_VK_SUCCESS(err);
18861
18862 VkMemoryRequirements memory_reqs;
18863 VkDeviceMemory buffer_memory;
18864 bool pass;
18865 VkMemoryAllocateInfo memory_info = {};
18866 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18867 memory_info.pNext = NULL;
18868 memory_info.allocationSize = 0;
18869 memory_info.memoryTypeIndex = 0;
18870
18871 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18872 memory_info.allocationSize = memory_reqs.size;
18873 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18874 ASSERT_TRUE(pass);
18875
18876 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18877 ASSERT_VK_SUCCESS(err);
18878 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18879 ASSERT_VK_SUCCESS(err);
18880
18881 VkDescriptorPoolSize ds_type_count = {};
18882 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18883 ds_type_count.descriptorCount = 1;
18884
18885 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18886 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18887 ds_pool_ci.pNext = NULL;
18888 ds_pool_ci.maxSets = 1;
18889 ds_pool_ci.poolSizeCount = 1;
18890 ds_pool_ci.pPoolSizes = &ds_type_count;
18891
18892 VkDescriptorPool ds_pool;
18893 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18894 ASSERT_VK_SUCCESS(err);
18895
18896 VkDescriptorSetLayoutBinding dsl_binding = {};
18897 dsl_binding.binding = 0;
18898 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18899 dsl_binding.descriptorCount = 1;
18900 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18901 dsl_binding.pImmutableSamplers = NULL;
18902
18903 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18904 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18905 ds_layout_ci.pNext = NULL;
18906 ds_layout_ci.bindingCount = 1;
18907 ds_layout_ci.pBindings = &dsl_binding;
18908 VkDescriptorSetLayout ds_layout;
18909 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18910 ASSERT_VK_SUCCESS(err);
18911
18912 VkDescriptorSet descriptor_set;
18913 VkDescriptorSetAllocateInfo alloc_info = {};
18914 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18915 alloc_info.descriptorSetCount = 1;
18916 alloc_info.descriptorPool = ds_pool;
18917 alloc_info.pSetLayouts = &ds_layout;
18918 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18919 ASSERT_VK_SUCCESS(err);
18920
18921 VkDescriptorBufferInfo buffer_info = {};
18922 buffer_info.buffer = buffer;
18923 buffer_info.offset = 0;
18924 buffer_info.range = 1024;
18925
18926 VkWriteDescriptorSet descriptor_write;
18927 memset(&descriptor_write, 0, sizeof(descriptor_write));
18928 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18929 descriptor_write.dstSet = descriptor_set;
18930 descriptor_write.dstBinding = 0;
18931 descriptor_write.descriptorCount = 1;
18932 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18933 descriptor_write.pBufferInfo = &buffer_info;
18934
18935 // Set pImageInfo and pTexelBufferView to invalid values, which should
18936 // be
18937 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18938 // This will most likely produce a crash if the parameter_validation
18939 // layer
18940 // does not correctly ignore pImageInfo.
18941 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18942 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18943
18944 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18945
18946 m_errorMonitor->VerifyNotFound();
18947
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018948 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18949 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18950 vkDestroyBuffer(m_device->device(), buffer, NULL);
18951 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18952 }
18953
18954 // Texel Buffer Case
18955 {
18956 m_errorMonitor->ExpectSuccess();
18957
18958 VkBuffer buffer;
18959 uint32_t queue_family_index = 0;
18960 VkBufferCreateInfo buffer_create_info = {};
18961 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18962 buffer_create_info.size = 1024;
18963 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18964 buffer_create_info.queueFamilyIndexCount = 1;
18965 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18966
18967 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18968 ASSERT_VK_SUCCESS(err);
18969
18970 VkMemoryRequirements memory_reqs;
18971 VkDeviceMemory buffer_memory;
18972 bool pass;
18973 VkMemoryAllocateInfo memory_info = {};
18974 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18975 memory_info.pNext = NULL;
18976 memory_info.allocationSize = 0;
18977 memory_info.memoryTypeIndex = 0;
18978
18979 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18980 memory_info.allocationSize = memory_reqs.size;
18981 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18982 ASSERT_TRUE(pass);
18983
18984 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18985 ASSERT_VK_SUCCESS(err);
18986 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18987 ASSERT_VK_SUCCESS(err);
18988
18989 VkBufferViewCreateInfo buff_view_ci = {};
18990 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18991 buff_view_ci.buffer = buffer;
18992 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18993 buff_view_ci.range = VK_WHOLE_SIZE;
18994 VkBufferView buffer_view;
18995 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18996
18997 VkDescriptorPoolSize ds_type_count = {};
18998 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18999 ds_type_count.descriptorCount = 1;
19000
19001 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19002 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19003 ds_pool_ci.pNext = NULL;
19004 ds_pool_ci.maxSets = 1;
19005 ds_pool_ci.poolSizeCount = 1;
19006 ds_pool_ci.pPoolSizes = &ds_type_count;
19007
19008 VkDescriptorPool ds_pool;
19009 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19010 ASSERT_VK_SUCCESS(err);
19011
19012 VkDescriptorSetLayoutBinding dsl_binding = {};
19013 dsl_binding.binding = 0;
19014 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19015 dsl_binding.descriptorCount = 1;
19016 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19017 dsl_binding.pImmutableSamplers = NULL;
19018
19019 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19020 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19021 ds_layout_ci.pNext = NULL;
19022 ds_layout_ci.bindingCount = 1;
19023 ds_layout_ci.pBindings = &dsl_binding;
19024 VkDescriptorSetLayout ds_layout;
19025 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19026 ASSERT_VK_SUCCESS(err);
19027
19028 VkDescriptorSet descriptor_set;
19029 VkDescriptorSetAllocateInfo alloc_info = {};
19030 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19031 alloc_info.descriptorSetCount = 1;
19032 alloc_info.descriptorPool = ds_pool;
19033 alloc_info.pSetLayouts = &ds_layout;
19034 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19035 ASSERT_VK_SUCCESS(err);
19036
19037 VkWriteDescriptorSet descriptor_write;
19038 memset(&descriptor_write, 0, sizeof(descriptor_write));
19039 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19040 descriptor_write.dstSet = descriptor_set;
19041 descriptor_write.dstBinding = 0;
19042 descriptor_write.descriptorCount = 1;
19043 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19044 descriptor_write.pTexelBufferView = &buffer_view;
19045
19046 // Set pImageInfo and pBufferInfo to invalid values, which should be
19047 // ignored for descriptorType ==
19048 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19049 // This will most likely produce a crash if the parameter_validation
19050 // layer
19051 // does not correctly ignore pImageInfo and pBufferInfo.
19052 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19053 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19054
19055 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19056
19057 m_errorMonitor->VerifyNotFound();
19058
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019059 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19060 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19061 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19062 vkDestroyBuffer(m_device->device(), buffer, NULL);
19063 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19064 }
19065}
19066
Tobin Ehlisf7428442016-10-25 07:58:24 -060019067TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19068 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19069
Tony Barbour1fa09702017-03-16 12:09:08 -060019070 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019071 // Create layout where two binding #s are "1"
19072 static const uint32_t NUM_BINDINGS = 3;
19073 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19074 dsl_binding[0].binding = 1;
19075 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19076 dsl_binding[0].descriptorCount = 1;
19077 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19078 dsl_binding[0].pImmutableSamplers = NULL;
19079 dsl_binding[1].binding = 0;
19080 dsl_binding[1].descriptorCount = 1;
19081 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19082 dsl_binding[1].descriptorCount = 1;
19083 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19084 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019085 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019086 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19087 dsl_binding[2].descriptorCount = 1;
19088 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19089 dsl_binding[2].pImmutableSamplers = NULL;
19090
19091 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19092 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19093 ds_layout_ci.pNext = NULL;
19094 ds_layout_ci.bindingCount = NUM_BINDINGS;
19095 ds_layout_ci.pBindings = dsl_binding;
19096 VkDescriptorSetLayout ds_layout;
19097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
19098 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19099 m_errorMonitor->VerifyFound();
19100}
19101
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019102TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019103 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
19104
Tony Barbour1fa09702017-03-16 12:09:08 -060019105 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019106
Tony Barbour552f6c02016-12-21 14:34:07 -070019107 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019108
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019109 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
19110
19111 {
19112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
19113 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
19114 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19115 m_errorMonitor->VerifyFound();
19116 }
19117
19118 {
19119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
19120 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
19121 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19122 m_errorMonitor->VerifyFound();
19123 }
19124
19125 {
19126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19127 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 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_01450);
19134 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 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_01451);
19141 VkViewport viewport = {limits.viewportBoundsRange[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_01452);
19148 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
19149 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19150 m_errorMonitor->VerifyFound();
19151 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019152
19153 {
19154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19155 VkRect2D scissor = {{-1, 0}, {16, 16}};
19156 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19157 m_errorMonitor->VerifyFound();
19158 }
19159
19160 {
19161 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19162 VkRect2D scissor = {{0, -2}, {16, 16}};
19163 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19164 m_errorMonitor->VerifyFound();
19165 }
19166
19167 {
19168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
19169 VkRect2D scissor = {{100, 100}, {INT_MAX, 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_01491);
19176 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
19177 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19178 m_errorMonitor->VerifyFound();
19179 }
19180
Tony Barbour552f6c02016-12-21 14:34:07 -070019181 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019182}
19183
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019184// This is a positive test. No failures are expected.
19185TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
19186 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
19187 VkResult err;
19188
Tony Barbour1fa09702017-03-16 12:09:08 -060019189 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019190 m_errorMonitor->ExpectSuccess();
19191 VkDescriptorPoolSize ds_type_count = {};
19192 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19193 ds_type_count.descriptorCount = 2;
19194
19195 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19196 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19197 ds_pool_ci.pNext = NULL;
19198 ds_pool_ci.maxSets = 1;
19199 ds_pool_ci.poolSizeCount = 1;
19200 ds_pool_ci.pPoolSizes = &ds_type_count;
19201
19202 VkDescriptorPool ds_pool;
19203 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19204 ASSERT_VK_SUCCESS(err);
19205
19206 // Create layout with two uniform buffer descriptors w/ empty binding between them
19207 static const uint32_t NUM_BINDINGS = 3;
19208 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19209 dsl_binding[0].binding = 0;
19210 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19211 dsl_binding[0].descriptorCount = 1;
19212 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
19213 dsl_binding[0].pImmutableSamplers = NULL;
19214 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019215 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019216 dsl_binding[2].binding = 2;
19217 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19218 dsl_binding[2].descriptorCount = 1;
19219 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
19220 dsl_binding[2].pImmutableSamplers = NULL;
19221
19222 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19223 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19224 ds_layout_ci.pNext = NULL;
19225 ds_layout_ci.bindingCount = NUM_BINDINGS;
19226 ds_layout_ci.pBindings = dsl_binding;
19227 VkDescriptorSetLayout ds_layout;
19228 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19229 ASSERT_VK_SUCCESS(err);
19230
19231 VkDescriptorSet descriptor_set = {};
19232 VkDescriptorSetAllocateInfo alloc_info = {};
19233 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19234 alloc_info.descriptorSetCount = 1;
19235 alloc_info.descriptorPool = ds_pool;
19236 alloc_info.pSetLayouts = &ds_layout;
19237 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19238 ASSERT_VK_SUCCESS(err);
19239
19240 // Create a buffer to be used for update
19241 VkBufferCreateInfo buff_ci = {};
19242 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19243 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19244 buff_ci.size = 256;
19245 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19246 VkBuffer buffer;
19247 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19248 ASSERT_VK_SUCCESS(err);
19249 // Have to bind memory to buffer before descriptor update
19250 VkMemoryAllocateInfo mem_alloc = {};
19251 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19252 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019253 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019254 mem_alloc.memoryTypeIndex = 0;
19255
19256 VkMemoryRequirements mem_reqs;
19257 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19258 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19259 if (!pass) {
19260 vkDestroyBuffer(m_device->device(), buffer, NULL);
19261 return;
19262 }
19263
19264 VkDeviceMemory mem;
19265 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19266 ASSERT_VK_SUCCESS(err);
19267 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19268 ASSERT_VK_SUCCESS(err);
19269
19270 // Only update the descriptor at binding 2
19271 VkDescriptorBufferInfo buff_info = {};
19272 buff_info.buffer = buffer;
19273 buff_info.offset = 0;
19274 buff_info.range = VK_WHOLE_SIZE;
19275 VkWriteDescriptorSet descriptor_write = {};
19276 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19277 descriptor_write.dstBinding = 2;
19278 descriptor_write.descriptorCount = 1;
19279 descriptor_write.pTexelBufferView = nullptr;
19280 descriptor_write.pBufferInfo = &buff_info;
19281 descriptor_write.pImageInfo = nullptr;
19282 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19283 descriptor_write.dstSet = descriptor_set;
19284
19285 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19286
19287 m_errorMonitor->VerifyNotFound();
19288 // Cleanup
19289 vkFreeMemory(m_device->device(), mem, NULL);
19290 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19291 vkDestroyBuffer(m_device->device(), buffer, NULL);
19292 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19293}
19294
19295// This is a positive test. No failures are expected.
19296TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19297 VkResult err;
19298 bool pass;
19299
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019300 TEST_DESCRIPTION(
19301 "Create a buffer, allocate memory, bind memory, destroy "
19302 "the buffer, create an image, and bind the same memory to "
19303 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019304
19305 m_errorMonitor->ExpectSuccess();
19306
Tony Barbour1fa09702017-03-16 12:09:08 -060019307 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019308
19309 VkBuffer buffer;
19310 VkImage image;
19311 VkDeviceMemory mem;
19312 VkMemoryRequirements mem_reqs;
19313
19314 VkBufferCreateInfo buf_info = {};
19315 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19316 buf_info.pNext = NULL;
19317 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19318 buf_info.size = 256;
19319 buf_info.queueFamilyIndexCount = 0;
19320 buf_info.pQueueFamilyIndices = NULL;
19321 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19322 buf_info.flags = 0;
19323 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19324 ASSERT_VK_SUCCESS(err);
19325
19326 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19327
19328 VkMemoryAllocateInfo alloc_info = {};
19329 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19330 alloc_info.pNext = NULL;
19331 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019332
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019333 // Ensure memory is big enough for both bindings
19334 alloc_info.allocationSize = 0x10000;
19335
19336 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19337 if (!pass) {
19338 vkDestroyBuffer(m_device->device(), buffer, NULL);
19339 return;
19340 }
19341
19342 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19343 ASSERT_VK_SUCCESS(err);
19344
19345 uint8_t *pData;
19346 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19347 ASSERT_VK_SUCCESS(err);
19348
19349 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19350
19351 vkUnmapMemory(m_device->device(), mem);
19352
19353 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19354 ASSERT_VK_SUCCESS(err);
19355
19356 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19357 // memory. In fact, it was never used by the GPU.
19358 // Just be be sure, wait for idle.
19359 vkDestroyBuffer(m_device->device(), buffer, NULL);
19360 vkDeviceWaitIdle(m_device->device());
19361
Tobin Ehlis6a005702016-12-28 15:25:56 -070019362 // Use optimal as some platforms report linear support but then fail image creation
19363 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19364 VkImageFormatProperties image_format_properties;
19365 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19366 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19367 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019368 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019369 vkFreeMemory(m_device->device(), mem, NULL);
19370 return;
19371 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019372 VkImageCreateInfo image_create_info = {};
19373 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19374 image_create_info.pNext = NULL;
19375 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19376 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19377 image_create_info.extent.width = 64;
19378 image_create_info.extent.height = 64;
19379 image_create_info.extent.depth = 1;
19380 image_create_info.mipLevels = 1;
19381 image_create_info.arrayLayers = 1;
19382 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019383 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019384 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19385 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19386 image_create_info.queueFamilyIndexCount = 0;
19387 image_create_info.pQueueFamilyIndices = NULL;
19388 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19389 image_create_info.flags = 0;
19390
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019391 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019392 * to be textures or it will be the staging image if they are not.
19393 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019394 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19395 ASSERT_VK_SUCCESS(err);
19396
19397 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19398
Tobin Ehlis6a005702016-12-28 15:25:56 -070019399 VkMemoryAllocateInfo mem_alloc = {};
19400 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19401 mem_alloc.pNext = NULL;
19402 mem_alloc.allocationSize = 0;
19403 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019404 mem_alloc.allocationSize = mem_reqs.size;
19405
19406 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19407 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019408 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019409 vkDestroyImage(m_device->device(), image, NULL);
19410 return;
19411 }
19412
19413 // VALIDATION FAILURE:
19414 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19415 ASSERT_VK_SUCCESS(err);
19416
19417 m_errorMonitor->VerifyNotFound();
19418
19419 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019420 vkDestroyImage(m_device->device(), image, NULL);
19421}
19422
Tony Barbourab713912017-02-02 14:17:35 -070019423// This is a positive test. No failures are expected.
19424TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19425 VkResult err;
19426
19427 TEST_DESCRIPTION(
19428 "Call all applicable destroy and free routines with NULL"
19429 "handles, expecting no validation errors");
19430
19431 m_errorMonitor->ExpectSuccess();
19432
Tony Barbour1fa09702017-03-16 12:09:08 -060019433 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019434 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19435 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19436 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19437 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19438 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19439 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19440 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19441 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19442 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19443 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19444 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19445 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19446 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19447 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19448 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19449 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19450 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19451 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19452 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19453 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19454
19455 VkCommandPool command_pool;
19456 VkCommandPoolCreateInfo pool_create_info{};
19457 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19458 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19459 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19460 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19461 VkCommandBuffer command_buffers[3] = {};
19462 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19463 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19464 command_buffer_allocate_info.commandPool = command_pool;
19465 command_buffer_allocate_info.commandBufferCount = 1;
19466 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19467 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19468 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19469 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19470
19471 VkDescriptorPoolSize ds_type_count = {};
19472 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19473 ds_type_count.descriptorCount = 1;
19474
19475 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19476 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19477 ds_pool_ci.pNext = NULL;
19478 ds_pool_ci.maxSets = 1;
19479 ds_pool_ci.poolSizeCount = 1;
19480 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19481 ds_pool_ci.pPoolSizes = &ds_type_count;
19482
19483 VkDescriptorPool ds_pool;
19484 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19485 ASSERT_VK_SUCCESS(err);
19486
19487 VkDescriptorSetLayoutBinding dsl_binding = {};
19488 dsl_binding.binding = 2;
19489 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19490 dsl_binding.descriptorCount = 1;
19491 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19492 dsl_binding.pImmutableSamplers = NULL;
19493 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19494 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19495 ds_layout_ci.pNext = NULL;
19496 ds_layout_ci.bindingCount = 1;
19497 ds_layout_ci.pBindings = &dsl_binding;
19498 VkDescriptorSetLayout ds_layout;
19499 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19500 ASSERT_VK_SUCCESS(err);
19501
19502 VkDescriptorSet descriptor_sets[3] = {};
19503 VkDescriptorSetAllocateInfo alloc_info = {};
19504 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19505 alloc_info.descriptorSetCount = 1;
19506 alloc_info.descriptorPool = ds_pool;
19507 alloc_info.pSetLayouts = &ds_layout;
19508 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19509 ASSERT_VK_SUCCESS(err);
19510 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19511 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19512 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19513
19514 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19515
19516 m_errorMonitor->VerifyNotFound();
19517}
19518
Tony Barbour626994c2017-02-08 15:29:37 -070019519TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019520 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019521
19522 m_errorMonitor->ExpectSuccess();
19523
Tony Barbour1fa09702017-03-16 12:09:08 -060019524 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019525 VkCommandBuffer cmd_bufs[4];
19526 VkCommandBufferAllocateInfo alloc_info;
19527 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19528 alloc_info.pNext = NULL;
19529 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019530 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019531 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19532 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19533 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019534 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070019535 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19536 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019537 ASSERT_TRUE(image.initialized());
19538 VkCommandBufferBeginInfo cb_binfo;
19539 cb_binfo.pNext = NULL;
19540 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19541 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19542 cb_binfo.flags = 0;
19543 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19544 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19545 VkImageMemoryBarrier img_barrier = {};
19546 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19547 img_barrier.pNext = NULL;
19548 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19549 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19550 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19551 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19552 img_barrier.image = image.handle();
19553 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19554 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19555 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19556 img_barrier.subresourceRange.baseArrayLayer = 0;
19557 img_barrier.subresourceRange.baseMipLevel = 0;
19558 img_barrier.subresourceRange.layerCount = 1;
19559 img_barrier.subresourceRange.levelCount = 1;
19560 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19561 &img_barrier);
19562 vkEndCommandBuffer(cmd_bufs[0]);
19563 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19564 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19565 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19566 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19567 &img_barrier);
19568 vkEndCommandBuffer(cmd_bufs[1]);
19569 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19570 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19571 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19572 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19573 &img_barrier);
19574 vkEndCommandBuffer(cmd_bufs[2]);
19575 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19576 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19577 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19578 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19579 &img_barrier);
19580 vkEndCommandBuffer(cmd_bufs[3]);
19581
19582 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19583 VkSemaphore semaphore1, semaphore2;
19584 VkSemaphoreCreateInfo semaphore_create_info{};
19585 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19586 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19587 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19588 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19589 VkSubmitInfo submit_info[3];
19590 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19591 submit_info[0].pNext = nullptr;
19592 submit_info[0].commandBufferCount = 1;
19593 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19594 submit_info[0].signalSemaphoreCount = 1;
19595 submit_info[0].pSignalSemaphores = &semaphore1;
19596 submit_info[0].waitSemaphoreCount = 0;
19597 submit_info[0].pWaitDstStageMask = nullptr;
19598 submit_info[0].pWaitDstStageMask = flags;
19599 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19600 submit_info[1].pNext = nullptr;
19601 submit_info[1].commandBufferCount = 1;
19602 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19603 submit_info[1].waitSemaphoreCount = 1;
19604 submit_info[1].pWaitSemaphores = &semaphore1;
19605 submit_info[1].signalSemaphoreCount = 1;
19606 submit_info[1].pSignalSemaphores = &semaphore2;
19607 submit_info[1].pWaitDstStageMask = flags;
19608 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19609 submit_info[2].pNext = nullptr;
19610 submit_info[2].commandBufferCount = 2;
19611 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19612 submit_info[2].waitSemaphoreCount = 1;
19613 submit_info[2].pWaitSemaphores = &semaphore2;
19614 submit_info[2].signalSemaphoreCount = 0;
19615 submit_info[2].pSignalSemaphores = nullptr;
19616 submit_info[2].pWaitDstStageMask = flags;
19617 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19618 vkQueueWaitIdle(m_device->m_queue);
19619
19620 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19621 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19622 m_errorMonitor->VerifyNotFound();
19623}
19624
Tobin Ehlis953e8392016-11-17 10:54:13 -070019625TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19626 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19627 // We previously had a bug where dynamic offset of inactive bindings was still being used
19628 VkResult err;
19629 m_errorMonitor->ExpectSuccess();
19630
Tony Barbour1fa09702017-03-16 12:09:08 -060019631 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019632 ASSERT_NO_FATAL_FAILURE(InitViewport());
19633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19634
19635 VkDescriptorPoolSize ds_type_count = {};
19636 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19637 ds_type_count.descriptorCount = 3;
19638
19639 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19640 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19641 ds_pool_ci.pNext = NULL;
19642 ds_pool_ci.maxSets = 1;
19643 ds_pool_ci.poolSizeCount = 1;
19644 ds_pool_ci.pPoolSizes = &ds_type_count;
19645
19646 VkDescriptorPool ds_pool;
19647 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19648 ASSERT_VK_SUCCESS(err);
19649
19650 const uint32_t BINDING_COUNT = 3;
19651 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019652 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019653 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19654 dsl_binding[0].descriptorCount = 1;
19655 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19656 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019657 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019658 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19659 dsl_binding[1].descriptorCount = 1;
19660 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19661 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019662 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019663 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19664 dsl_binding[2].descriptorCount = 1;
19665 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19666 dsl_binding[2].pImmutableSamplers = NULL;
19667
19668 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19669 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19670 ds_layout_ci.pNext = NULL;
19671 ds_layout_ci.bindingCount = BINDING_COUNT;
19672 ds_layout_ci.pBindings = dsl_binding;
19673 VkDescriptorSetLayout ds_layout;
19674 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19675 ASSERT_VK_SUCCESS(err);
19676
19677 VkDescriptorSet descriptor_set;
19678 VkDescriptorSetAllocateInfo alloc_info = {};
19679 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19680 alloc_info.descriptorSetCount = 1;
19681 alloc_info.descriptorPool = ds_pool;
19682 alloc_info.pSetLayouts = &ds_layout;
19683 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19684 ASSERT_VK_SUCCESS(err);
19685
19686 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19687 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19688 pipeline_layout_ci.pNext = NULL;
19689 pipeline_layout_ci.setLayoutCount = 1;
19690 pipeline_layout_ci.pSetLayouts = &ds_layout;
19691
19692 VkPipelineLayout pipeline_layout;
19693 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19694 ASSERT_VK_SUCCESS(err);
19695
19696 // Create two buffers to update the descriptors with
19697 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19698 uint32_t qfi = 0;
19699 VkBufferCreateInfo buffCI = {};
19700 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19701 buffCI.size = 2048;
19702 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19703 buffCI.queueFamilyIndexCount = 1;
19704 buffCI.pQueueFamilyIndices = &qfi;
19705
19706 VkBuffer dyub1;
19707 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19708 ASSERT_VK_SUCCESS(err);
19709 // buffer2
19710 buffCI.size = 1024;
19711 VkBuffer dyub2;
19712 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19713 ASSERT_VK_SUCCESS(err);
19714 // Allocate memory and bind to buffers
19715 VkMemoryAllocateInfo mem_alloc[2] = {};
19716 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19717 mem_alloc[0].pNext = NULL;
19718 mem_alloc[0].memoryTypeIndex = 0;
19719 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19720 mem_alloc[1].pNext = NULL;
19721 mem_alloc[1].memoryTypeIndex = 0;
19722
19723 VkMemoryRequirements mem_reqs1;
19724 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19725 VkMemoryRequirements mem_reqs2;
19726 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19727 mem_alloc[0].allocationSize = mem_reqs1.size;
19728 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19729 mem_alloc[1].allocationSize = mem_reqs2.size;
19730 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19731 if (!pass) {
19732 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19733 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19734 return;
19735 }
19736
19737 VkDeviceMemory mem1;
19738 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19739 ASSERT_VK_SUCCESS(err);
19740 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19741 ASSERT_VK_SUCCESS(err);
19742 VkDeviceMemory mem2;
19743 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19744 ASSERT_VK_SUCCESS(err);
19745 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19746 ASSERT_VK_SUCCESS(err);
19747 // Update descriptors
19748 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19749 buff_info[0].buffer = dyub1;
19750 buff_info[0].offset = 0;
19751 buff_info[0].range = 256;
19752 buff_info[1].buffer = dyub1;
19753 buff_info[1].offset = 256;
19754 buff_info[1].range = 512;
19755 buff_info[2].buffer = dyub2;
19756 buff_info[2].offset = 0;
19757 buff_info[2].range = 512;
19758
19759 VkWriteDescriptorSet descriptor_write;
19760 memset(&descriptor_write, 0, sizeof(descriptor_write));
19761 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19762 descriptor_write.dstSet = descriptor_set;
19763 descriptor_write.dstBinding = 0;
19764 descriptor_write.descriptorCount = BINDING_COUNT;
19765 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19766 descriptor_write.pBufferInfo = buff_info;
19767
19768 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19769
Tony Barbour552f6c02016-12-21 14:34:07 -070019770 m_commandBuffer->BeginCommandBuffer();
19771 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019772
19773 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019774 char const *vsSource =
19775 "#version 450\n"
19776 "\n"
19777 "out gl_PerVertex { \n"
19778 " vec4 gl_Position;\n"
19779 "};\n"
19780 "void main(){\n"
19781 " gl_Position = vec4(1);\n"
19782 "}\n";
19783 char const *fsSource =
19784 "#version 450\n"
19785 "\n"
19786 "layout(location=0) out vec4 x;\n"
19787 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19788 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19789 "void main(){\n"
19790 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19791 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019792 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19793 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19794 VkPipelineObj pipe(m_device);
19795 pipe.SetViewport(m_viewports);
19796 pipe.SetScissor(m_scissors);
19797 pipe.AddShader(&vs);
19798 pipe.AddShader(&fs);
19799 pipe.AddColorAttachment();
19800 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19801
19802 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19803 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19804 // we used to have a bug in this case.
19805 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19806 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19807 &descriptor_set, BINDING_COUNT, dyn_off);
19808 Draw(1, 0, 0, 0);
19809 m_errorMonitor->VerifyNotFound();
19810
19811 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19812 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19813 vkFreeMemory(m_device->device(), mem1, NULL);
19814 vkFreeMemory(m_device->device(), mem2, NULL);
19815
19816 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19817 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19818 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19819}
19820
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019821TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019822 TEST_DESCRIPTION(
19823 "Ensure that validations handling of non-coherent memory "
19824 "mapping while using VK_WHOLE_SIZE does not cause access "
19825 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019826 VkResult err;
19827 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019828 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019829
19830 VkDeviceMemory mem;
19831 VkMemoryRequirements mem_reqs;
19832 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019833 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019834 VkMemoryAllocateInfo alloc_info = {};
19835 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19836 alloc_info.pNext = NULL;
19837 alloc_info.memoryTypeIndex = 0;
19838
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019839 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019840 alloc_info.allocationSize = allocation_size;
19841
19842 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19843 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 -070019844 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019845 if (!pass) {
19846 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019847 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19848 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019849 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019850 pass = m_device->phy().set_memory_type(
19851 mem_reqs.memoryTypeBits, &alloc_info,
19852 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19853 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019854 if (!pass) {
19855 return;
19856 }
19857 }
19858 }
19859
19860 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19861 ASSERT_VK_SUCCESS(err);
19862
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019863 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019864 m_errorMonitor->ExpectSuccess();
19865 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19866 ASSERT_VK_SUCCESS(err);
19867 VkMappedMemoryRange mmr = {};
19868 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19869 mmr.memory = mem;
19870 mmr.offset = 0;
19871 mmr.size = VK_WHOLE_SIZE;
19872 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19873 ASSERT_VK_SUCCESS(err);
19874 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19875 ASSERT_VK_SUCCESS(err);
19876 m_errorMonitor->VerifyNotFound();
19877 vkUnmapMemory(m_device->device(), mem);
19878
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019879 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019880 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019881 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019882 ASSERT_VK_SUCCESS(err);
19883 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19884 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019885 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019886 mmr.size = VK_WHOLE_SIZE;
19887 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19888 ASSERT_VK_SUCCESS(err);
19889 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19890 ASSERT_VK_SUCCESS(err);
19891 m_errorMonitor->VerifyNotFound();
19892 vkUnmapMemory(m_device->device(), mem);
19893
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019894 // Map with offset and size
19895 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019896 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019897 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019898 ASSERT_VK_SUCCESS(err);
19899 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19900 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019901 mmr.offset = 4 * atom_size;
19902 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019903 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19904 ASSERT_VK_SUCCESS(err);
19905 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19906 ASSERT_VK_SUCCESS(err);
19907 m_errorMonitor->VerifyNotFound();
19908 vkUnmapMemory(m_device->device(), mem);
19909
19910 // Map without offset and flush WHOLE_SIZE with two separate offsets
19911 m_errorMonitor->ExpectSuccess();
19912 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19913 ASSERT_VK_SUCCESS(err);
19914 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19915 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019916 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019917 mmr.size = VK_WHOLE_SIZE;
19918 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19919 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019920 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019921 mmr.size = VK_WHOLE_SIZE;
19922 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19923 ASSERT_VK_SUCCESS(err);
19924 m_errorMonitor->VerifyNotFound();
19925 vkUnmapMemory(m_device->device(), mem);
19926
19927 vkFreeMemory(m_device->device(), mem, NULL);
19928}
19929
19930// This is a positive test. We used to expect error in this case but spec now allows it
19931TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19932 m_errorMonitor->ExpectSuccess();
19933 vk_testing::Fence testFence;
19934 VkFenceCreateInfo fenceInfo = {};
19935 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19936 fenceInfo.pNext = NULL;
19937
Tony Barbour1fa09702017-03-16 12:09:08 -060019938 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019939 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019940 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019941 VkResult result = vkResetFences(m_device->device(), 1, fences);
19942 ASSERT_VK_SUCCESS(result);
19943
19944 m_errorMonitor->VerifyNotFound();
19945}
19946
19947TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19948 m_errorMonitor->ExpectSuccess();
19949
Tony Barbour1fa09702017-03-16 12:09:08 -060019950 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019951 VkResult err;
19952
19953 // Record (empty!) command buffer that can be submitted multiple times
19954 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019955 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19956 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019957 m_commandBuffer->BeginCommandBuffer(&cbbi);
19958 m_commandBuffer->EndCommandBuffer();
19959
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019960 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019961 VkFence fence;
19962 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19963 ASSERT_VK_SUCCESS(err);
19964
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019965 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019966 VkSemaphore s1, s2;
19967 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19968 ASSERT_VK_SUCCESS(err);
19969 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19970 ASSERT_VK_SUCCESS(err);
19971
19972 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019973 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019974 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19975 ASSERT_VK_SUCCESS(err);
19976
19977 // Submit CB again, signaling s2.
19978 si.pSignalSemaphores = &s2;
19979 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19980 ASSERT_VK_SUCCESS(err);
19981
19982 // Wait for fence.
19983 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19984 ASSERT_VK_SUCCESS(err);
19985
19986 // CB is still in flight from second submission, but semaphore s1 is no
19987 // longer in flight. delete it.
19988 vkDestroySemaphore(m_device->device(), s1, nullptr);
19989
19990 m_errorMonitor->VerifyNotFound();
19991
19992 // Force device idle and clean up remaining objects
19993 vkDeviceWaitIdle(m_device->device());
19994 vkDestroySemaphore(m_device->device(), s2, nullptr);
19995 vkDestroyFence(m_device->device(), fence, nullptr);
19996}
19997
19998TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19999 m_errorMonitor->ExpectSuccess();
20000
Tony Barbour1fa09702017-03-16 12:09:08 -060020001 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020002 VkResult err;
20003
20004 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020005 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020006 VkFence f1;
20007 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20008 ASSERT_VK_SUCCESS(err);
20009
20010 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020011 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020012 VkFence f2;
20013 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20014 ASSERT_VK_SUCCESS(err);
20015
20016 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020017 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020018 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20019
20020 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020021 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020022 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20023
20024 // Should have both retired!
20025 vkDestroyFence(m_device->device(), f1, nullptr);
20026 vkDestroyFence(m_device->device(), f2, nullptr);
20027
20028 m_errorMonitor->VerifyNotFound();
20029}
20030
20031TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020032 TEST_DESCRIPTION(
20033 "Verify that creating an image view from an image with valid usage "
20034 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020035
Tony Barbour1fa09702017-03-16 12:09:08 -060020036 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020037
20038 m_errorMonitor->ExpectSuccess();
20039 // Verify that we can create a view with usage INPUT_ATTACHMENT
20040 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020041 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 -060020042 ASSERT_TRUE(image.initialized());
20043 VkImageView imageView;
20044 VkImageViewCreateInfo ivci = {};
20045 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20046 ivci.image = image.handle();
20047 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20048 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20049 ivci.subresourceRange.layerCount = 1;
20050 ivci.subresourceRange.baseMipLevel = 0;
20051 ivci.subresourceRange.levelCount = 1;
20052 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20053
20054 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20055 m_errorMonitor->VerifyNotFound();
20056 vkDestroyImageView(m_device->device(), imageView, NULL);
20057}
20058
20059// This is a positive test. No failures are expected.
20060TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020061 TEST_DESCRIPTION(
20062 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20063 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020064
Tony Barbour1fa09702017-03-16 12:09:08 -060020065 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020066
20067 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020068 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020069 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020070
20071 m_errorMonitor->ExpectSuccess();
20072
20073 VkImage image;
20074 VkImageCreateInfo image_create_info = {};
20075 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20076 image_create_info.pNext = NULL;
20077 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20078 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20079 image_create_info.extent.width = 64;
20080 image_create_info.extent.height = 64;
20081 image_create_info.extent.depth = 1;
20082 image_create_info.mipLevels = 1;
20083 image_create_info.arrayLayers = 1;
20084 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20085 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20086 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20087 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20088 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20089 ASSERT_VK_SUCCESS(err);
20090
20091 VkMemoryRequirements memory_reqs;
20092 VkDeviceMemory memory_one, memory_two;
20093 bool pass;
20094 VkMemoryAllocateInfo memory_info = {};
20095 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20096 memory_info.pNext = NULL;
20097 memory_info.allocationSize = 0;
20098 memory_info.memoryTypeIndex = 0;
20099 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20100 // Find an image big enough to allow sparse mapping of 2 memory regions
20101 // Increase the image size until it is at least twice the
20102 // size of the required alignment, to ensure we can bind both
20103 // allocated memory blocks to the image on aligned offsets.
20104 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
20105 vkDestroyImage(m_device->device(), image, nullptr);
20106 image_create_info.extent.width *= 2;
20107 image_create_info.extent.height *= 2;
20108 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
20109 ASSERT_VK_SUCCESS(err);
20110 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20111 }
20112 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
20113 // at the end of the first
20114 memory_info.allocationSize = memory_reqs.alignment;
20115 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20116 ASSERT_TRUE(pass);
20117 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
20118 ASSERT_VK_SUCCESS(err);
20119 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
20120 ASSERT_VK_SUCCESS(err);
20121 VkSparseMemoryBind binds[2];
20122 binds[0].flags = 0;
20123 binds[0].memory = memory_one;
20124 binds[0].memoryOffset = 0;
20125 binds[0].resourceOffset = 0;
20126 binds[0].size = memory_info.allocationSize;
20127 binds[1].flags = 0;
20128 binds[1].memory = memory_two;
20129 binds[1].memoryOffset = 0;
20130 binds[1].resourceOffset = memory_info.allocationSize;
20131 binds[1].size = memory_info.allocationSize;
20132
20133 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
20134 opaqueBindInfo.image = image;
20135 opaqueBindInfo.bindCount = 2;
20136 opaqueBindInfo.pBinds = binds;
20137
20138 VkFence fence = VK_NULL_HANDLE;
20139 VkBindSparseInfo bindSparseInfo = {};
20140 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
20141 bindSparseInfo.imageOpaqueBindCount = 1;
20142 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
20143
20144 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
20145 vkQueueWaitIdle(m_device->m_queue);
20146 vkDestroyImage(m_device->device(), image, NULL);
20147 vkFreeMemory(m_device->device(), memory_one, NULL);
20148 vkFreeMemory(m_device->device(), memory_two, NULL);
20149 m_errorMonitor->VerifyNotFound();
20150}
20151
20152TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020153 TEST_DESCRIPTION(
20154 "Ensure that CmdBeginRenderPass with an attachment's "
20155 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
20156 "the command buffer has prior knowledge of that "
20157 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020158
20159 m_errorMonitor->ExpectSuccess();
20160
Tony Barbour1fa09702017-03-16 12:09:08 -060020161 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020162
20163 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020164 VkAttachmentDescription attachment = {0,
20165 VK_FORMAT_R8G8B8A8_UNORM,
20166 VK_SAMPLE_COUNT_1_BIT,
20167 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20168 VK_ATTACHMENT_STORE_OP_STORE,
20169 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20170 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20171 VK_IMAGE_LAYOUT_UNDEFINED,
20172 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020173
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020174 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020175
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020176 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020177
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020178 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020179
20180 VkRenderPass rp;
20181 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20182 ASSERT_VK_SUCCESS(err);
20183
20184 // A compatible framebuffer.
20185 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020186 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 -060020187 ASSERT_TRUE(image.initialized());
20188
20189 VkImageViewCreateInfo ivci = {
20190 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20191 nullptr,
20192 0,
20193 image.handle(),
20194 VK_IMAGE_VIEW_TYPE_2D,
20195 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020196 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20197 VK_COMPONENT_SWIZZLE_IDENTITY},
20198 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020199 };
20200 VkImageView view;
20201 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20202 ASSERT_VK_SUCCESS(err);
20203
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020204 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020205 VkFramebuffer fb;
20206 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20207 ASSERT_VK_SUCCESS(err);
20208
20209 // Record a single command buffer which uses this renderpass twice. The
20210 // bug is triggered at the beginning of the second renderpass, when the
20211 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020212 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 -070020213 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020214 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20215 vkCmdEndRenderPass(m_commandBuffer->handle());
20216 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20217
20218 m_errorMonitor->VerifyNotFound();
20219
20220 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020221 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020222
20223 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20224 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20225 vkDestroyImageView(m_device->device(), view, nullptr);
20226}
20227
20228TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020229 TEST_DESCRIPTION(
20230 "This test should pass. Create a Framebuffer and "
20231 "command buffer, bind them together, then destroy "
20232 "command pool and framebuffer and verify there are no "
20233 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020234
20235 m_errorMonitor->ExpectSuccess();
20236
Tony Barbour1fa09702017-03-16 12:09:08 -060020237 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020238
20239 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020240 VkAttachmentDescription attachment = {0,
20241 VK_FORMAT_R8G8B8A8_UNORM,
20242 VK_SAMPLE_COUNT_1_BIT,
20243 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20244 VK_ATTACHMENT_STORE_OP_STORE,
20245 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20246 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20247 VK_IMAGE_LAYOUT_UNDEFINED,
20248 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020249
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020250 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020251
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020252 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020253
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020254 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020255
20256 VkRenderPass rp;
20257 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20258 ASSERT_VK_SUCCESS(err);
20259
20260 // A compatible framebuffer.
20261 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020262 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 -060020263 ASSERT_TRUE(image.initialized());
20264
20265 VkImageViewCreateInfo ivci = {
20266 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20267 nullptr,
20268 0,
20269 image.handle(),
20270 VK_IMAGE_VIEW_TYPE_2D,
20271 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020272 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20273 VK_COMPONENT_SWIZZLE_IDENTITY},
20274 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020275 };
20276 VkImageView view;
20277 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20278 ASSERT_VK_SUCCESS(err);
20279
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020280 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020281 VkFramebuffer fb;
20282 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20283 ASSERT_VK_SUCCESS(err);
20284
20285 // Explicitly create a command buffer to bind the FB to so that we can then
20286 // destroy the command pool in order to implicitly free command buffer
20287 VkCommandPool command_pool;
20288 VkCommandPoolCreateInfo pool_create_info{};
20289 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20290 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20291 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20292 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20293
20294 VkCommandBuffer command_buffer;
20295 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20296 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20297 command_buffer_allocate_info.commandPool = command_pool;
20298 command_buffer_allocate_info.commandBufferCount = 1;
20299 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20300 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20301
20302 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020303 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 -060020304 VkCommandBufferBeginInfo begin_info{};
20305 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20306 vkBeginCommandBuffer(command_buffer, &begin_info);
20307
20308 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20309 vkCmdEndRenderPass(command_buffer);
20310 vkEndCommandBuffer(command_buffer);
20311 vkDestroyImageView(m_device->device(), view, nullptr);
20312 // Destroy command pool to implicitly free command buffer
20313 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20314 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20315 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20316 m_errorMonitor->VerifyNotFound();
20317}
20318
20319TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020320 TEST_DESCRIPTION(
20321 "Ensure that CmdBeginRenderPass applies the layout "
20322 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020323
20324 m_errorMonitor->ExpectSuccess();
20325
Tony Barbour1fa09702017-03-16 12:09:08 -060020326 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020327
20328 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020329 VkAttachmentDescription attachment = {0,
20330 VK_FORMAT_R8G8B8A8_UNORM,
20331 VK_SAMPLE_COUNT_1_BIT,
20332 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20333 VK_ATTACHMENT_STORE_OP_STORE,
20334 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20335 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20336 VK_IMAGE_LAYOUT_UNDEFINED,
20337 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020338
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020339 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020340
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020341 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020342
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020343 VkSubpassDependency dep = {0,
20344 0,
20345 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20346 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20347 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20348 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20349 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020350
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020351 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020352
20353 VkResult err;
20354 VkRenderPass rp;
20355 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20356 ASSERT_VK_SUCCESS(err);
20357
20358 // A compatible framebuffer.
20359 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020360 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 -060020361 ASSERT_TRUE(image.initialized());
20362
20363 VkImageViewCreateInfo ivci = {
20364 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20365 nullptr,
20366 0,
20367 image.handle(),
20368 VK_IMAGE_VIEW_TYPE_2D,
20369 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020370 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20371 VK_COMPONENT_SWIZZLE_IDENTITY},
20372 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020373 };
20374 VkImageView view;
20375 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20376 ASSERT_VK_SUCCESS(err);
20377
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020378 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020379 VkFramebuffer fb;
20380 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20381 ASSERT_VK_SUCCESS(err);
20382
20383 // Record a single command buffer which issues a pipeline barrier w/
20384 // image memory barrier for the attachment. This detects the previously
20385 // missing tracking of the subpass layout by throwing a validation error
20386 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020387 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 -070020388 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020389 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20390
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020391 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20392 nullptr,
20393 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20394 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20395 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20396 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20397 VK_QUEUE_FAMILY_IGNORED,
20398 VK_QUEUE_FAMILY_IGNORED,
20399 image.handle(),
20400 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020401 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020402 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20403 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020404
20405 vkCmdEndRenderPass(m_commandBuffer->handle());
20406 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020407 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020408
20409 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20410 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20411 vkDestroyImageView(m_device->device(), view, nullptr);
20412}
20413
20414TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020415 TEST_DESCRIPTION(
20416 "Validate that when an imageView of a depth/stencil image "
20417 "is used as a depth/stencil framebuffer attachment, the "
20418 "aspectMask is ignored and both depth and stencil image "
20419 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020420
Tony Barbour1fa09702017-03-16 12:09:08 -060020421 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020422 VkFormatProperties format_properties;
20423 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20424 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20425 return;
20426 }
20427
20428 m_errorMonitor->ExpectSuccess();
20429
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020430 VkAttachmentDescription attachment = {0,
20431 VK_FORMAT_D32_SFLOAT_S8_UINT,
20432 VK_SAMPLE_COUNT_1_BIT,
20433 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20434 VK_ATTACHMENT_STORE_OP_STORE,
20435 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20436 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20437 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20438 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020439
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020440 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020441
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020442 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020443
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020444 VkSubpassDependency dep = {0,
20445 0,
20446 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20447 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20448 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20449 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20450 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020451
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020452 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020453
20454 VkResult err;
20455 VkRenderPass rp;
20456 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20457 ASSERT_VK_SUCCESS(err);
20458
20459 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020460 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
20461 0x26, // usage
20462 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020463 ASSERT_TRUE(image.initialized());
20464 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20465
20466 VkImageViewCreateInfo ivci = {
20467 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20468 nullptr,
20469 0,
20470 image.handle(),
20471 VK_IMAGE_VIEW_TYPE_2D,
20472 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020473 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20474 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020475 };
20476 VkImageView view;
20477 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20478 ASSERT_VK_SUCCESS(err);
20479
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020480 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020481 VkFramebuffer fb;
20482 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20483 ASSERT_VK_SUCCESS(err);
20484
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020485 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 -070020486 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020487 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20488
20489 VkImageMemoryBarrier imb = {};
20490 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20491 imb.pNext = nullptr;
20492 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20493 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20494 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20495 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20496 imb.srcQueueFamilyIndex = 0;
20497 imb.dstQueueFamilyIndex = 0;
20498 imb.image = image.handle();
20499 imb.subresourceRange.aspectMask = 0x6;
20500 imb.subresourceRange.baseMipLevel = 0;
20501 imb.subresourceRange.levelCount = 0x1;
20502 imb.subresourceRange.baseArrayLayer = 0;
20503 imb.subresourceRange.layerCount = 0x1;
20504
20505 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020506 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20507 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020508
20509 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020510 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020511 QueueCommandBuffer(false);
20512 m_errorMonitor->VerifyNotFound();
20513
20514 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20515 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20516 vkDestroyImageView(m_device->device(), view, nullptr);
20517}
20518
20519TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020520 TEST_DESCRIPTION(
20521 "Ensure that layout transitions work correctly without "
20522 "errors, when an attachment reference is "
20523 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020524
20525 m_errorMonitor->ExpectSuccess();
20526
Tony Barbour1fa09702017-03-16 12:09:08 -060020527 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020528
20529 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020530 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020531
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020532 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020533
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020534 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020535
20536 VkRenderPass rp;
20537 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20538 ASSERT_VK_SUCCESS(err);
20539
20540 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020541 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020542 VkFramebuffer fb;
20543 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20544 ASSERT_VK_SUCCESS(err);
20545
20546 // Record a command buffer which just begins and ends the renderpass. The
20547 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020548 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 -070020549 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020550 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20551 vkCmdEndRenderPass(m_commandBuffer->handle());
20552 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020553 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020554
20555 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20556 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20557}
20558
20559// This is a positive test. No errors are expected.
20560TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020561 TEST_DESCRIPTION(
20562 "Create a stencil-only attachment with a LOAD_OP set to "
20563 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020564 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020565 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020566 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020567 if (!depth_format) {
20568 printf(" No Depth + Stencil format found. Skipped.\n");
20569 return;
20570 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020571 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020572 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020573 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20574 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020575 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20576 return;
20577 }
20578
Tony Barbourf887b162017-03-09 10:06:46 -070020579 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020580 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020581 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020582 VkAttachmentDescription att = {};
20583 VkAttachmentReference ref = {};
20584 att.format = depth_stencil_fmt;
20585 att.samples = VK_SAMPLE_COUNT_1_BIT;
20586 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20587 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20588 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20589 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20590 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20591 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20592
20593 VkClearValue clear;
20594 clear.depthStencil.depth = 1.0;
20595 clear.depthStencil.stencil = 0;
20596 ref.attachment = 0;
20597 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20598
20599 VkSubpassDescription subpass = {};
20600 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20601 subpass.flags = 0;
20602 subpass.inputAttachmentCount = 0;
20603 subpass.pInputAttachments = NULL;
20604 subpass.colorAttachmentCount = 0;
20605 subpass.pColorAttachments = NULL;
20606 subpass.pResolveAttachments = NULL;
20607 subpass.pDepthStencilAttachment = &ref;
20608 subpass.preserveAttachmentCount = 0;
20609 subpass.pPreserveAttachments = NULL;
20610
20611 VkRenderPass rp;
20612 VkRenderPassCreateInfo rp_info = {};
20613 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20614 rp_info.attachmentCount = 1;
20615 rp_info.pAttachments = &att;
20616 rp_info.subpassCount = 1;
20617 rp_info.pSubpasses = &subpass;
20618 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20619 ASSERT_VK_SUCCESS(result);
20620
20621 VkImageView *depthView = m_depthStencil->BindInfo();
20622 VkFramebufferCreateInfo fb_info = {};
20623 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20624 fb_info.pNext = NULL;
20625 fb_info.renderPass = rp;
20626 fb_info.attachmentCount = 1;
20627 fb_info.pAttachments = depthView;
20628 fb_info.width = 100;
20629 fb_info.height = 100;
20630 fb_info.layers = 1;
20631 VkFramebuffer fb;
20632 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20633 ASSERT_VK_SUCCESS(result);
20634
20635 VkRenderPassBeginInfo rpbinfo = {};
20636 rpbinfo.clearValueCount = 1;
20637 rpbinfo.pClearValues = &clear;
20638 rpbinfo.pNext = NULL;
20639 rpbinfo.renderPass = rp;
20640 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20641 rpbinfo.renderArea.extent.width = 100;
20642 rpbinfo.renderArea.extent.height = 100;
20643 rpbinfo.renderArea.offset.x = 0;
20644 rpbinfo.renderArea.offset.y = 0;
20645 rpbinfo.framebuffer = fb;
20646
20647 VkFence fence = {};
20648 VkFenceCreateInfo fence_ci = {};
20649 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20650 fence_ci.pNext = nullptr;
20651 fence_ci.flags = 0;
20652 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20653 ASSERT_VK_SUCCESS(result);
20654
20655 m_commandBuffer->BeginCommandBuffer();
20656 m_commandBuffer->BeginRenderPass(rpbinfo);
20657 m_commandBuffer->EndRenderPass();
20658 m_commandBuffer->EndCommandBuffer();
20659 m_commandBuffer->QueueCommandBuffer(fence);
20660
20661 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020662 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 -070020663 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020664 VkImageMemoryBarrier barrier = {};
20665 VkImageSubresourceRange range;
20666 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20667 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20668 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20669 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20670 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20671 barrier.image = m_depthStencil->handle();
20672 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20673 range.baseMipLevel = 0;
20674 range.levelCount = 1;
20675 range.baseArrayLayer = 0;
20676 range.layerCount = 1;
20677 barrier.subresourceRange = range;
20678 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20679 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20680 cmdbuf.BeginCommandBuffer();
20681 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 -070020682 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020683 barrier.srcAccessMask = 0;
20684 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20685 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20686 barrier.image = destImage.handle();
20687 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20688 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 -070020689 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020690 VkImageCopy cregion;
20691 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20692 cregion.srcSubresource.mipLevel = 0;
20693 cregion.srcSubresource.baseArrayLayer = 0;
20694 cregion.srcSubresource.layerCount = 1;
20695 cregion.srcOffset.x = 0;
20696 cregion.srcOffset.y = 0;
20697 cregion.srcOffset.z = 0;
20698 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20699 cregion.dstSubresource.mipLevel = 0;
20700 cregion.dstSubresource.baseArrayLayer = 0;
20701 cregion.dstSubresource.layerCount = 1;
20702 cregion.dstOffset.x = 0;
20703 cregion.dstOffset.y = 0;
20704 cregion.dstOffset.z = 0;
20705 cregion.extent.width = 100;
20706 cregion.extent.height = 100;
20707 cregion.extent.depth = 1;
20708 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020709 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020710 cmdbuf.EndCommandBuffer();
20711
20712 VkSubmitInfo submit_info;
20713 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20714 submit_info.pNext = NULL;
20715 submit_info.waitSemaphoreCount = 0;
20716 submit_info.pWaitSemaphores = NULL;
20717 submit_info.pWaitDstStageMask = NULL;
20718 submit_info.commandBufferCount = 1;
20719 submit_info.pCommandBuffers = &cmdbuf.handle();
20720 submit_info.signalSemaphoreCount = 0;
20721 submit_info.pSignalSemaphores = NULL;
20722
20723 m_errorMonitor->ExpectSuccess();
20724 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20725 m_errorMonitor->VerifyNotFound();
20726
20727 vkQueueWaitIdle(m_device->m_queue);
20728 vkDestroyFence(m_device->device(), fence, nullptr);
20729 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20730 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20731}
20732
20733// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020734TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20735 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20736
20737 m_errorMonitor->ExpectSuccess();
20738
Tony Barbour1fa09702017-03-16 12:09:08 -060020739 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020740 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020741 if (!depth_format) {
20742 printf(" No Depth + Stencil format found. Skipped.\n");
20743 return;
20744 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20746
20747 VkImageMemoryBarrier img_barrier = {};
20748 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20749 img_barrier.pNext = NULL;
20750 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20751 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20752 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20753 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20754 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20755 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20756 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20757 img_barrier.subresourceRange.baseArrayLayer = 0;
20758 img_barrier.subresourceRange.baseMipLevel = 0;
20759 img_barrier.subresourceRange.layerCount = 1;
20760 img_barrier.subresourceRange.levelCount = 1;
20761
20762 {
20763 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020764 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 -070020765 ASSERT_TRUE(img_color.initialized());
20766
20767 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020768 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 -070020769 ASSERT_TRUE(img_ds1.initialized());
20770
20771 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020772 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 -070020773 ASSERT_TRUE(img_ds2.initialized());
20774
20775 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020776 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 -070020777 ASSERT_TRUE(img_xfer_src.initialized());
20778
20779 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020780 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 -070020781 ASSERT_TRUE(img_xfer_dst.initialized());
20782
20783 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020784 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 -070020785 ASSERT_TRUE(img_sampled.initialized());
20786
20787 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020788 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 -070020789 ASSERT_TRUE(img_input.initialized());
20790
20791 const struct {
20792 VkImageObj &image_obj;
20793 VkImageLayout old_layout;
20794 VkImageLayout new_layout;
20795 } buffer_layouts[] = {
20796 // clang-format off
20797 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20798 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20799 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20800 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20801 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20802 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20803 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20804 // clang-format on
20805 };
20806 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20807
20808 m_commandBuffer->BeginCommandBuffer();
20809 for (uint32_t i = 0; i < layout_count; ++i) {
20810 img_barrier.image = buffer_layouts[i].image_obj.handle();
20811 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20812 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20813 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20814 : VK_IMAGE_ASPECT_COLOR_BIT;
20815
20816 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20817 img_barrier.newLayout = buffer_layouts[i].new_layout;
20818 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20819 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20820
20821 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20822 img_barrier.newLayout = buffer_layouts[i].old_layout;
20823 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20824 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20825 }
20826 m_commandBuffer->EndCommandBuffer();
20827
20828 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20829 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20830 }
20831 m_errorMonitor->VerifyNotFound();
20832}
20833
20834// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020835TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20836 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20837
20838 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020839 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020840
20841 VkEvent event;
20842 VkEventCreateInfo event_create_info{};
20843 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20844 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20845
20846 VkCommandPool command_pool;
20847 VkCommandPoolCreateInfo pool_create_info{};
20848 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20849 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20850 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20851 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20852
20853 VkCommandBuffer command_buffer;
20854 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20855 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20856 command_buffer_allocate_info.commandPool = command_pool;
20857 command_buffer_allocate_info.commandBufferCount = 1;
20858 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20859 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20860
20861 VkQueue queue = VK_NULL_HANDLE;
20862 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20863
20864 {
20865 VkCommandBufferBeginInfo begin_info{};
20866 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20867 vkBeginCommandBuffer(command_buffer, &begin_info);
20868
20869 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 -070020870 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020871 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20872 vkEndCommandBuffer(command_buffer);
20873 }
20874 {
20875 VkSubmitInfo submit_info{};
20876 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20877 submit_info.commandBufferCount = 1;
20878 submit_info.pCommandBuffers = &command_buffer;
20879 submit_info.signalSemaphoreCount = 0;
20880 submit_info.pSignalSemaphores = nullptr;
20881 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20882 }
20883 { vkSetEvent(m_device->device(), event); }
20884
20885 vkQueueWaitIdle(queue);
20886
20887 vkDestroyEvent(m_device->device(), event, nullptr);
20888 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20889 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20890
20891 m_errorMonitor->VerifyNotFound();
20892}
20893// This is a positive test. No errors should be generated.
20894TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20895 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20896
Tony Barbour1fa09702017-03-16 12:09:08 -060020897 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020898 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020899
20900 m_errorMonitor->ExpectSuccess();
20901
20902 VkQueryPool query_pool;
20903 VkQueryPoolCreateInfo query_pool_create_info{};
20904 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20905 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20906 query_pool_create_info.queryCount = 1;
20907 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20908
20909 VkCommandPool command_pool;
20910 VkCommandPoolCreateInfo pool_create_info{};
20911 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20912 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20913 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20914 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20915
20916 VkCommandBuffer command_buffer;
20917 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20918 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20919 command_buffer_allocate_info.commandPool = command_pool;
20920 command_buffer_allocate_info.commandBufferCount = 1;
20921 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20922 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20923
20924 VkCommandBuffer secondary_command_buffer;
20925 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20926 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20927
20928 VkQueue queue = VK_NULL_HANDLE;
20929 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20930
20931 uint32_t qfi = 0;
20932 VkBufferCreateInfo buff_create_info = {};
20933 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20934 buff_create_info.size = 1024;
20935 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20936 buff_create_info.queueFamilyIndexCount = 1;
20937 buff_create_info.pQueueFamilyIndices = &qfi;
20938
20939 VkResult err;
20940 VkBuffer buffer;
20941 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20942 ASSERT_VK_SUCCESS(err);
20943 VkMemoryAllocateInfo mem_alloc = {};
20944 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20945 mem_alloc.pNext = NULL;
20946 mem_alloc.allocationSize = 1024;
20947 mem_alloc.memoryTypeIndex = 0;
20948
20949 VkMemoryRequirements memReqs;
20950 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20951 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20952 if (!pass) {
20953 vkDestroyBuffer(m_device->device(), buffer, NULL);
20954 return;
20955 }
20956
20957 VkDeviceMemory mem;
20958 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20959 ASSERT_VK_SUCCESS(err);
20960 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20961 ASSERT_VK_SUCCESS(err);
20962
20963 VkCommandBufferInheritanceInfo hinfo = {};
20964 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20965 hinfo.renderPass = VK_NULL_HANDLE;
20966 hinfo.subpass = 0;
20967 hinfo.framebuffer = VK_NULL_HANDLE;
20968 hinfo.occlusionQueryEnable = VK_FALSE;
20969 hinfo.queryFlags = 0;
20970 hinfo.pipelineStatistics = 0;
20971
20972 {
20973 VkCommandBufferBeginInfo begin_info{};
20974 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20975 begin_info.pInheritanceInfo = &hinfo;
20976 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20977
20978 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20979 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20980
20981 vkEndCommandBuffer(secondary_command_buffer);
20982
20983 begin_info.pInheritanceInfo = nullptr;
20984 vkBeginCommandBuffer(command_buffer, &begin_info);
20985
20986 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20987 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20988
20989 vkEndCommandBuffer(command_buffer);
20990 }
20991 {
20992 VkSubmitInfo submit_info{};
20993 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20994 submit_info.commandBufferCount = 1;
20995 submit_info.pCommandBuffers = &command_buffer;
20996 submit_info.signalSemaphoreCount = 0;
20997 submit_info.pSignalSemaphores = nullptr;
20998 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20999 }
21000
21001 vkQueueWaitIdle(queue);
21002
21003 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21004 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21005 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21006 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21007 vkDestroyBuffer(m_device->device(), buffer, NULL);
21008 vkFreeMemory(m_device->device(), mem, NULL);
21009
21010 m_errorMonitor->VerifyNotFound();
21011}
21012
21013// This is a positive test. No errors should be generated.
21014TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21015 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21016
Tony Barbour1fa09702017-03-16 12:09:08 -060021017 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021018 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021019
21020 m_errorMonitor->ExpectSuccess();
21021
21022 VkQueryPool query_pool;
21023 VkQueryPoolCreateInfo query_pool_create_info{};
21024 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21025 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21026 query_pool_create_info.queryCount = 1;
21027 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21028
21029 VkCommandPool command_pool;
21030 VkCommandPoolCreateInfo pool_create_info{};
21031 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21032 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21033 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21034 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21035
21036 VkCommandBuffer command_buffer[2];
21037 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21038 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21039 command_buffer_allocate_info.commandPool = command_pool;
21040 command_buffer_allocate_info.commandBufferCount = 2;
21041 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21042 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21043
21044 VkQueue queue = VK_NULL_HANDLE;
21045 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21046
21047 uint32_t qfi = 0;
21048 VkBufferCreateInfo buff_create_info = {};
21049 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21050 buff_create_info.size = 1024;
21051 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21052 buff_create_info.queueFamilyIndexCount = 1;
21053 buff_create_info.pQueueFamilyIndices = &qfi;
21054
21055 VkResult err;
21056 VkBuffer buffer;
21057 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21058 ASSERT_VK_SUCCESS(err);
21059 VkMemoryAllocateInfo mem_alloc = {};
21060 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21061 mem_alloc.pNext = NULL;
21062 mem_alloc.allocationSize = 1024;
21063 mem_alloc.memoryTypeIndex = 0;
21064
21065 VkMemoryRequirements memReqs;
21066 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21067 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21068 if (!pass) {
21069 vkDestroyBuffer(m_device->device(), buffer, NULL);
21070 return;
21071 }
21072
21073 VkDeviceMemory mem;
21074 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21075 ASSERT_VK_SUCCESS(err);
21076 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21077 ASSERT_VK_SUCCESS(err);
21078
21079 {
21080 VkCommandBufferBeginInfo begin_info{};
21081 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21082 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21083
21084 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21085 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21086
21087 vkEndCommandBuffer(command_buffer[0]);
21088
21089 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21090
21091 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21092
21093 vkEndCommandBuffer(command_buffer[1]);
21094 }
21095 {
21096 VkSubmitInfo submit_info{};
21097 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21098 submit_info.commandBufferCount = 2;
21099 submit_info.pCommandBuffers = command_buffer;
21100 submit_info.signalSemaphoreCount = 0;
21101 submit_info.pSignalSemaphores = nullptr;
21102 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21103 }
21104
21105 vkQueueWaitIdle(queue);
21106
21107 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21108 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
21109 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21110 vkDestroyBuffer(m_device->device(), buffer, NULL);
21111 vkFreeMemory(m_device->device(), mem, NULL);
21112
21113 m_errorMonitor->VerifyNotFound();
21114}
21115
Tony Barbourc46924f2016-11-04 11:49:52 -060021116TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021117 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
21118
Tony Barbour1fa09702017-03-16 12:09:08 -060021119 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021120 VkEvent event;
21121 VkEventCreateInfo event_create_info{};
21122 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21123 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21124
21125 VkCommandPool command_pool;
21126 VkCommandPoolCreateInfo pool_create_info{};
21127 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21128 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21129 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21130 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21131
21132 VkCommandBuffer command_buffer;
21133 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21134 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21135 command_buffer_allocate_info.commandPool = command_pool;
21136 command_buffer_allocate_info.commandBufferCount = 1;
21137 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21138 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21139
21140 VkQueue queue = VK_NULL_HANDLE;
21141 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21142
21143 {
21144 VkCommandBufferBeginInfo begin_info{};
21145 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21146 vkBeginCommandBuffer(command_buffer, &begin_info);
21147
21148 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021149 vkEndCommandBuffer(command_buffer);
21150 }
21151 {
21152 VkSubmitInfo submit_info{};
21153 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21154 submit_info.commandBufferCount = 1;
21155 submit_info.pCommandBuffers = &command_buffer;
21156 submit_info.signalSemaphoreCount = 0;
21157 submit_info.pSignalSemaphores = nullptr;
21158 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21159 }
21160 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021161 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
21162 "that is already in use by a "
21163 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021164 vkSetEvent(m_device->device(), event);
21165 m_errorMonitor->VerifyFound();
21166 }
21167
21168 vkQueueWaitIdle(queue);
21169
21170 vkDestroyEvent(m_device->device(), event, nullptr);
21171 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21172 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21173}
21174
21175// This is a positive test. No errors should be generated.
21176TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021177 TEST_DESCRIPTION(
21178 "Two command buffers with two separate fences are each "
21179 "run through a Submit & WaitForFences cycle 3 times. This "
21180 "previously revealed a bug so running this positive test "
21181 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021182 m_errorMonitor->ExpectSuccess();
21183
Tony Barbour1fa09702017-03-16 12:09:08 -060021184 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021185 VkQueue queue = VK_NULL_HANDLE;
21186 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21187
21188 static const uint32_t NUM_OBJECTS = 2;
21189 static const uint32_t NUM_FRAMES = 3;
21190 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
21191 VkFence fences[NUM_OBJECTS] = {};
21192
21193 VkCommandPool cmd_pool;
21194 VkCommandPoolCreateInfo cmd_pool_ci = {};
21195 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21196 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
21197 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21198 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
21199 ASSERT_VK_SUCCESS(err);
21200
21201 VkCommandBufferAllocateInfo cmd_buf_info = {};
21202 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21203 cmd_buf_info.commandPool = cmd_pool;
21204 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21205 cmd_buf_info.commandBufferCount = 1;
21206
21207 VkFenceCreateInfo fence_ci = {};
21208 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21209 fence_ci.pNext = nullptr;
21210 fence_ci.flags = 0;
21211
21212 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21213 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
21214 ASSERT_VK_SUCCESS(err);
21215 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
21216 ASSERT_VK_SUCCESS(err);
21217 }
21218
21219 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
21220 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
21221 // Create empty cmd buffer
21222 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
21223 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21224
21225 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
21226 ASSERT_VK_SUCCESS(err);
21227 err = vkEndCommandBuffer(cmd_buffers[obj]);
21228 ASSERT_VK_SUCCESS(err);
21229
21230 VkSubmitInfo submit_info = {};
21231 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21232 submit_info.commandBufferCount = 1;
21233 submit_info.pCommandBuffers = &cmd_buffers[obj];
21234 // Submit cmd buffer and wait for fence
21235 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
21236 ASSERT_VK_SUCCESS(err);
21237 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21238 ASSERT_VK_SUCCESS(err);
21239 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21240 ASSERT_VK_SUCCESS(err);
21241 }
21242 }
21243 m_errorMonitor->VerifyNotFound();
21244 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21245 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21246 vkDestroyFence(m_device->device(), fences[i], nullptr);
21247 }
21248}
21249// This is a positive test. No errors should be generated.
21250TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021251 TEST_DESCRIPTION(
21252 "Two command buffers, each in a separate QueueSubmit call "
21253 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021254
Tony Barbour1fa09702017-03-16 12:09:08 -060021255 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021256 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021257
21258 m_errorMonitor->ExpectSuccess();
21259
21260 VkSemaphore semaphore;
21261 VkSemaphoreCreateInfo semaphore_create_info{};
21262 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21263 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21264
21265 VkCommandPool command_pool;
21266 VkCommandPoolCreateInfo pool_create_info{};
21267 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21268 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21269 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21270 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21271
21272 VkCommandBuffer command_buffer[2];
21273 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21274 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21275 command_buffer_allocate_info.commandPool = command_pool;
21276 command_buffer_allocate_info.commandBufferCount = 2;
21277 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21278 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21279
21280 VkQueue queue = VK_NULL_HANDLE;
21281 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21282
21283 {
21284 VkCommandBufferBeginInfo begin_info{};
21285 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21286 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21287
21288 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 -070021289 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021290
21291 VkViewport viewport{};
21292 viewport.maxDepth = 1.0f;
21293 viewport.minDepth = 0.0f;
21294 viewport.width = 512;
21295 viewport.height = 512;
21296 viewport.x = 0;
21297 viewport.y = 0;
21298 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21299 vkEndCommandBuffer(command_buffer[0]);
21300 }
21301 {
21302 VkCommandBufferBeginInfo begin_info{};
21303 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21304 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21305
21306 VkViewport viewport{};
21307 viewport.maxDepth = 1.0f;
21308 viewport.minDepth = 0.0f;
21309 viewport.width = 512;
21310 viewport.height = 512;
21311 viewport.x = 0;
21312 viewport.y = 0;
21313 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21314 vkEndCommandBuffer(command_buffer[1]);
21315 }
21316 {
21317 VkSubmitInfo submit_info{};
21318 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21319 submit_info.commandBufferCount = 1;
21320 submit_info.pCommandBuffers = &command_buffer[0];
21321 submit_info.signalSemaphoreCount = 1;
21322 submit_info.pSignalSemaphores = &semaphore;
21323 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21324 }
21325 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021326 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021327 VkSubmitInfo submit_info{};
21328 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21329 submit_info.commandBufferCount = 1;
21330 submit_info.pCommandBuffers = &command_buffer[1];
21331 submit_info.waitSemaphoreCount = 1;
21332 submit_info.pWaitSemaphores = &semaphore;
21333 submit_info.pWaitDstStageMask = flags;
21334 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21335 }
21336
21337 vkQueueWaitIdle(m_device->m_queue);
21338
21339 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21340 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21341 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21342
21343 m_errorMonitor->VerifyNotFound();
21344}
21345
21346// This is a positive test. No errors should be generated.
21347TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021348 TEST_DESCRIPTION(
21349 "Two command buffers, each in a separate QueueSubmit call "
21350 "submitted on separate queues, the second having a fence"
21351 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021352
Tony Barbour1fa09702017-03-16 12:09:08 -060021353 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021354 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021355
21356 m_errorMonitor->ExpectSuccess();
21357
21358 VkFence fence;
21359 VkFenceCreateInfo fence_create_info{};
21360 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21361 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21362
21363 VkSemaphore semaphore;
21364 VkSemaphoreCreateInfo semaphore_create_info{};
21365 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21366 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21367
21368 VkCommandPool command_pool;
21369 VkCommandPoolCreateInfo pool_create_info{};
21370 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21371 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21372 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21373 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21374
21375 VkCommandBuffer command_buffer[2];
21376 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21377 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21378 command_buffer_allocate_info.commandPool = command_pool;
21379 command_buffer_allocate_info.commandBufferCount = 2;
21380 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21381 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21382
21383 VkQueue queue = VK_NULL_HANDLE;
21384 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21385
21386 {
21387 VkCommandBufferBeginInfo begin_info{};
21388 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21389 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21390
21391 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 -070021392 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021393
21394 VkViewport viewport{};
21395 viewport.maxDepth = 1.0f;
21396 viewport.minDepth = 0.0f;
21397 viewport.width = 512;
21398 viewport.height = 512;
21399 viewport.x = 0;
21400 viewport.y = 0;
21401 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21402 vkEndCommandBuffer(command_buffer[0]);
21403 }
21404 {
21405 VkCommandBufferBeginInfo begin_info{};
21406 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21407 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21408
21409 VkViewport viewport{};
21410 viewport.maxDepth = 1.0f;
21411 viewport.minDepth = 0.0f;
21412 viewport.width = 512;
21413 viewport.height = 512;
21414 viewport.x = 0;
21415 viewport.y = 0;
21416 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21417 vkEndCommandBuffer(command_buffer[1]);
21418 }
21419 {
21420 VkSubmitInfo submit_info{};
21421 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21422 submit_info.commandBufferCount = 1;
21423 submit_info.pCommandBuffers = &command_buffer[0];
21424 submit_info.signalSemaphoreCount = 1;
21425 submit_info.pSignalSemaphores = &semaphore;
21426 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21427 }
21428 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021429 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021430 VkSubmitInfo submit_info{};
21431 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21432 submit_info.commandBufferCount = 1;
21433 submit_info.pCommandBuffers = &command_buffer[1];
21434 submit_info.waitSemaphoreCount = 1;
21435 submit_info.pWaitSemaphores = &semaphore;
21436 submit_info.pWaitDstStageMask = flags;
21437 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21438 }
21439
21440 vkQueueWaitIdle(m_device->m_queue);
21441
21442 vkDestroyFence(m_device->device(), fence, nullptr);
21443 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21444 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21445 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21446
21447 m_errorMonitor->VerifyNotFound();
21448}
21449
21450// This is a positive test. No errors should be generated.
21451TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021452 TEST_DESCRIPTION(
21453 "Two command buffers, each in a separate QueueSubmit call "
21454 "submitted on separate queues, the second having a fence"
21455 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021456
Tony Barbour1fa09702017-03-16 12:09:08 -060021457 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021458 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021459
21460 m_errorMonitor->ExpectSuccess();
21461
21462 VkFence fence;
21463 VkFenceCreateInfo fence_create_info{};
21464 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21465 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21466
21467 VkSemaphore semaphore;
21468 VkSemaphoreCreateInfo semaphore_create_info{};
21469 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21470 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21471
21472 VkCommandPool command_pool;
21473 VkCommandPoolCreateInfo pool_create_info{};
21474 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21475 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21476 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21477 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21478
21479 VkCommandBuffer command_buffer[2];
21480 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21481 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21482 command_buffer_allocate_info.commandPool = command_pool;
21483 command_buffer_allocate_info.commandBufferCount = 2;
21484 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21485 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21486
21487 VkQueue queue = VK_NULL_HANDLE;
21488 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21489
21490 {
21491 VkCommandBufferBeginInfo begin_info{};
21492 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21493 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21494
21495 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 -070021496 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021497
21498 VkViewport viewport{};
21499 viewport.maxDepth = 1.0f;
21500 viewport.minDepth = 0.0f;
21501 viewport.width = 512;
21502 viewport.height = 512;
21503 viewport.x = 0;
21504 viewport.y = 0;
21505 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21506 vkEndCommandBuffer(command_buffer[0]);
21507 }
21508 {
21509 VkCommandBufferBeginInfo begin_info{};
21510 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21511 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21512
21513 VkViewport viewport{};
21514 viewport.maxDepth = 1.0f;
21515 viewport.minDepth = 0.0f;
21516 viewport.width = 512;
21517 viewport.height = 512;
21518 viewport.x = 0;
21519 viewport.y = 0;
21520 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21521 vkEndCommandBuffer(command_buffer[1]);
21522 }
21523 {
21524 VkSubmitInfo submit_info{};
21525 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21526 submit_info.commandBufferCount = 1;
21527 submit_info.pCommandBuffers = &command_buffer[0];
21528 submit_info.signalSemaphoreCount = 1;
21529 submit_info.pSignalSemaphores = &semaphore;
21530 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21531 }
21532 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021533 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021534 VkSubmitInfo submit_info{};
21535 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21536 submit_info.commandBufferCount = 1;
21537 submit_info.pCommandBuffers = &command_buffer[1];
21538 submit_info.waitSemaphoreCount = 1;
21539 submit_info.pWaitSemaphores = &semaphore;
21540 submit_info.pWaitDstStageMask = flags;
21541 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21542 }
21543
21544 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21545 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21546
21547 vkDestroyFence(m_device->device(), fence, nullptr);
21548 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21549 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21550 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21551
21552 m_errorMonitor->VerifyNotFound();
21553}
21554
21555TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021556 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021557 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021558 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021559 return;
21560 }
21561
21562 VkResult err;
21563
21564 m_errorMonitor->ExpectSuccess();
21565
21566 VkQueue q0 = m_device->m_queue;
21567 VkQueue q1 = nullptr;
21568 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21569 ASSERT_NE(q1, nullptr);
21570
21571 // An (empty) command buffer. We must have work in the first submission --
21572 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021573 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021574 VkCommandPool pool;
21575 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21576 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021577 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21578 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021579 VkCommandBuffer cb;
21580 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21581 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021582 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021583 err = vkBeginCommandBuffer(cb, &cbbi);
21584 ASSERT_VK_SUCCESS(err);
21585 err = vkEndCommandBuffer(cb);
21586 ASSERT_VK_SUCCESS(err);
21587
21588 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021589 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021590 VkSemaphore s;
21591 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21592 ASSERT_VK_SUCCESS(err);
21593
21594 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021595 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021596
21597 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21598 ASSERT_VK_SUCCESS(err);
21599
21600 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021601 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021602 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021603
21604 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21605 ASSERT_VK_SUCCESS(err);
21606
21607 // Wait for q0 idle
21608 err = vkQueueWaitIdle(q0);
21609 ASSERT_VK_SUCCESS(err);
21610
21611 // Command buffer should have been completed (it was on q0); reset the pool.
21612 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21613
21614 m_errorMonitor->VerifyNotFound();
21615
21616 // Force device completely idle and clean up resources
21617 vkDeviceWaitIdle(m_device->device());
21618 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21619 vkDestroySemaphore(m_device->device(), s, nullptr);
21620}
21621
21622// This is a positive test. No errors should be generated.
21623TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021624 TEST_DESCRIPTION(
21625 "Two command buffers, each in a separate QueueSubmit call "
21626 "submitted on separate queues, the second having a fence, "
21627 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021628
Tony Barbour1fa09702017-03-16 12:09:08 -060021629 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021630 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021631
21632 m_errorMonitor->ExpectSuccess();
21633
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021634 VkFence fence;
21635 VkFenceCreateInfo fence_create_info{};
21636 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21637 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21638
21639 VkSemaphore semaphore;
21640 VkSemaphoreCreateInfo semaphore_create_info{};
21641 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21642 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21643
21644 VkCommandPool command_pool;
21645 VkCommandPoolCreateInfo pool_create_info{};
21646 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21647 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21648 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21649 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21650
21651 VkCommandBuffer command_buffer[2];
21652 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21653 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21654 command_buffer_allocate_info.commandPool = command_pool;
21655 command_buffer_allocate_info.commandBufferCount = 2;
21656 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21657 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21658
21659 VkQueue queue = VK_NULL_HANDLE;
21660 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21661
21662 {
21663 VkCommandBufferBeginInfo begin_info{};
21664 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21665 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21666
21667 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 -070021668 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021669
21670 VkViewport viewport{};
21671 viewport.maxDepth = 1.0f;
21672 viewport.minDepth = 0.0f;
21673 viewport.width = 512;
21674 viewport.height = 512;
21675 viewport.x = 0;
21676 viewport.y = 0;
21677 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21678 vkEndCommandBuffer(command_buffer[0]);
21679 }
21680 {
21681 VkCommandBufferBeginInfo begin_info{};
21682 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21683 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21684
21685 VkViewport viewport{};
21686 viewport.maxDepth = 1.0f;
21687 viewport.minDepth = 0.0f;
21688 viewport.width = 512;
21689 viewport.height = 512;
21690 viewport.x = 0;
21691 viewport.y = 0;
21692 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21693 vkEndCommandBuffer(command_buffer[1]);
21694 }
21695 {
21696 VkSubmitInfo submit_info{};
21697 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21698 submit_info.commandBufferCount = 1;
21699 submit_info.pCommandBuffers = &command_buffer[0];
21700 submit_info.signalSemaphoreCount = 1;
21701 submit_info.pSignalSemaphores = &semaphore;
21702 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21703 }
21704 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021705 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021706 VkSubmitInfo submit_info{};
21707 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21708 submit_info.commandBufferCount = 1;
21709 submit_info.pCommandBuffers = &command_buffer[1];
21710 submit_info.waitSemaphoreCount = 1;
21711 submit_info.pWaitSemaphores = &semaphore;
21712 submit_info.pWaitDstStageMask = flags;
21713 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21714 }
21715
21716 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21717
21718 vkDestroyFence(m_device->device(), fence, nullptr);
21719 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21720 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21721 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21722
21723 m_errorMonitor->VerifyNotFound();
21724}
21725
21726// This is a positive test. No errors should be generated.
21727TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021728 TEST_DESCRIPTION(
21729 "Two command buffers, each in a separate QueueSubmit call "
21730 "on the same queue, sharing a signal/wait semaphore, the "
21731 "second having a fence, "
21732 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021733
21734 m_errorMonitor->ExpectSuccess();
21735
Tony Barbour1fa09702017-03-16 12:09:08 -060021736 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021737 VkFence fence;
21738 VkFenceCreateInfo fence_create_info{};
21739 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21740 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21741
21742 VkSemaphore semaphore;
21743 VkSemaphoreCreateInfo semaphore_create_info{};
21744 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21745 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21746
21747 VkCommandPool command_pool;
21748 VkCommandPoolCreateInfo pool_create_info{};
21749 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21750 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21751 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21752 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21753
21754 VkCommandBuffer command_buffer[2];
21755 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21756 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21757 command_buffer_allocate_info.commandPool = command_pool;
21758 command_buffer_allocate_info.commandBufferCount = 2;
21759 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21760 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21761
21762 {
21763 VkCommandBufferBeginInfo begin_info{};
21764 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21765 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21766
21767 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 -070021768 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021769
21770 VkViewport viewport{};
21771 viewport.maxDepth = 1.0f;
21772 viewport.minDepth = 0.0f;
21773 viewport.width = 512;
21774 viewport.height = 512;
21775 viewport.x = 0;
21776 viewport.y = 0;
21777 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21778 vkEndCommandBuffer(command_buffer[0]);
21779 }
21780 {
21781 VkCommandBufferBeginInfo begin_info{};
21782 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21783 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21784
21785 VkViewport viewport{};
21786 viewport.maxDepth = 1.0f;
21787 viewport.minDepth = 0.0f;
21788 viewport.width = 512;
21789 viewport.height = 512;
21790 viewport.x = 0;
21791 viewport.y = 0;
21792 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21793 vkEndCommandBuffer(command_buffer[1]);
21794 }
21795 {
21796 VkSubmitInfo submit_info{};
21797 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21798 submit_info.commandBufferCount = 1;
21799 submit_info.pCommandBuffers = &command_buffer[0];
21800 submit_info.signalSemaphoreCount = 1;
21801 submit_info.pSignalSemaphores = &semaphore;
21802 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21803 }
21804 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021805 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021806 VkSubmitInfo submit_info{};
21807 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21808 submit_info.commandBufferCount = 1;
21809 submit_info.pCommandBuffers = &command_buffer[1];
21810 submit_info.waitSemaphoreCount = 1;
21811 submit_info.pWaitSemaphores = &semaphore;
21812 submit_info.pWaitDstStageMask = flags;
21813 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21814 }
21815
21816 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21817
21818 vkDestroyFence(m_device->device(), fence, nullptr);
21819 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21820 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21821 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21822
21823 m_errorMonitor->VerifyNotFound();
21824}
21825
21826// This is a positive test. No errors should be generated.
21827TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021828 TEST_DESCRIPTION(
21829 "Two command buffers, each in a separate QueueSubmit call "
21830 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21831 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021832
21833 m_errorMonitor->ExpectSuccess();
21834
Tony Barbour1fa09702017-03-16 12:09:08 -060021835 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021836 VkFence fence;
21837 VkFenceCreateInfo fence_create_info{};
21838 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21839 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21840
21841 VkCommandPool command_pool;
21842 VkCommandPoolCreateInfo pool_create_info{};
21843 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21844 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21845 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21846 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21847
21848 VkCommandBuffer command_buffer[2];
21849 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21850 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21851 command_buffer_allocate_info.commandPool = command_pool;
21852 command_buffer_allocate_info.commandBufferCount = 2;
21853 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21854 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21855
21856 {
21857 VkCommandBufferBeginInfo begin_info{};
21858 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21859 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21860
21861 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 -070021862 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021863
21864 VkViewport viewport{};
21865 viewport.maxDepth = 1.0f;
21866 viewport.minDepth = 0.0f;
21867 viewport.width = 512;
21868 viewport.height = 512;
21869 viewport.x = 0;
21870 viewport.y = 0;
21871 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21872 vkEndCommandBuffer(command_buffer[0]);
21873 }
21874 {
21875 VkCommandBufferBeginInfo begin_info{};
21876 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21877 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21878
21879 VkViewport viewport{};
21880 viewport.maxDepth = 1.0f;
21881 viewport.minDepth = 0.0f;
21882 viewport.width = 512;
21883 viewport.height = 512;
21884 viewport.x = 0;
21885 viewport.y = 0;
21886 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21887 vkEndCommandBuffer(command_buffer[1]);
21888 }
21889 {
21890 VkSubmitInfo submit_info{};
21891 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21892 submit_info.commandBufferCount = 1;
21893 submit_info.pCommandBuffers = &command_buffer[0];
21894 submit_info.signalSemaphoreCount = 0;
21895 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21896 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21897 }
21898 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021899 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021900 VkSubmitInfo submit_info{};
21901 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21902 submit_info.commandBufferCount = 1;
21903 submit_info.pCommandBuffers = &command_buffer[1];
21904 submit_info.waitSemaphoreCount = 0;
21905 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21906 submit_info.pWaitDstStageMask = flags;
21907 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21908 }
21909
21910 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21911
21912 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21913 ASSERT_VK_SUCCESS(err);
21914
21915 vkDestroyFence(m_device->device(), fence, nullptr);
21916 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21917 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21918
21919 m_errorMonitor->VerifyNotFound();
21920}
21921
21922// This is a positive test. No errors should be generated.
21923TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021924 TEST_DESCRIPTION(
21925 "Two command buffers, each in a separate QueueSubmit call "
21926 "on the same queue, the second having a fence, followed "
21927 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021928
21929 m_errorMonitor->ExpectSuccess();
21930
Tony Barbour1fa09702017-03-16 12:09:08 -060021931 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021932 VkFence fence;
21933 VkFenceCreateInfo fence_create_info{};
21934 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21935 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21936
21937 VkCommandPool command_pool;
21938 VkCommandPoolCreateInfo pool_create_info{};
21939 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21940 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21941 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21942 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21943
21944 VkCommandBuffer command_buffer[2];
21945 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21946 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21947 command_buffer_allocate_info.commandPool = command_pool;
21948 command_buffer_allocate_info.commandBufferCount = 2;
21949 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21950 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21951
21952 {
21953 VkCommandBufferBeginInfo begin_info{};
21954 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21955 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21956
21957 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 -070021958 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021959
21960 VkViewport viewport{};
21961 viewport.maxDepth = 1.0f;
21962 viewport.minDepth = 0.0f;
21963 viewport.width = 512;
21964 viewport.height = 512;
21965 viewport.x = 0;
21966 viewport.y = 0;
21967 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21968 vkEndCommandBuffer(command_buffer[0]);
21969 }
21970 {
21971 VkCommandBufferBeginInfo begin_info{};
21972 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21973 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21974
21975 VkViewport viewport{};
21976 viewport.maxDepth = 1.0f;
21977 viewport.minDepth = 0.0f;
21978 viewport.width = 512;
21979 viewport.height = 512;
21980 viewport.x = 0;
21981 viewport.y = 0;
21982 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21983 vkEndCommandBuffer(command_buffer[1]);
21984 }
21985 {
21986 VkSubmitInfo submit_info{};
21987 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21988 submit_info.commandBufferCount = 1;
21989 submit_info.pCommandBuffers = &command_buffer[0];
21990 submit_info.signalSemaphoreCount = 0;
21991 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21992 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21993 }
21994 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021995 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021996 VkSubmitInfo submit_info{};
21997 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21998 submit_info.commandBufferCount = 1;
21999 submit_info.pCommandBuffers = &command_buffer[1];
22000 submit_info.waitSemaphoreCount = 0;
22001 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22002 submit_info.pWaitDstStageMask = flags;
22003 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22004 }
22005
22006 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22007
22008 vkDestroyFence(m_device->device(), fence, nullptr);
22009 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22010 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22011
22012 m_errorMonitor->VerifyNotFound();
22013}
22014
22015// This is a positive test. No errors should be generated.
22016TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022017 TEST_DESCRIPTION(
22018 "Two command buffers each in a separate SubmitInfo sent in a single "
22019 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022020 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022021
22022 m_errorMonitor->ExpectSuccess();
22023
22024 VkFence fence;
22025 VkFenceCreateInfo fence_create_info{};
22026 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22027 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22028
22029 VkSemaphore semaphore;
22030 VkSemaphoreCreateInfo semaphore_create_info{};
22031 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22032 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22033
22034 VkCommandPool command_pool;
22035 VkCommandPoolCreateInfo pool_create_info{};
22036 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22037 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22038 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22039 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22040
22041 VkCommandBuffer command_buffer[2];
22042 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22043 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22044 command_buffer_allocate_info.commandPool = command_pool;
22045 command_buffer_allocate_info.commandBufferCount = 2;
22046 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22047 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22048
22049 {
22050 VkCommandBufferBeginInfo begin_info{};
22051 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22052 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22053
22054 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 -070022055 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022056
22057 VkViewport viewport{};
22058 viewport.maxDepth = 1.0f;
22059 viewport.minDepth = 0.0f;
22060 viewport.width = 512;
22061 viewport.height = 512;
22062 viewport.x = 0;
22063 viewport.y = 0;
22064 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22065 vkEndCommandBuffer(command_buffer[0]);
22066 }
22067 {
22068 VkCommandBufferBeginInfo begin_info{};
22069 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22070 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22071
22072 VkViewport viewport{};
22073 viewport.maxDepth = 1.0f;
22074 viewport.minDepth = 0.0f;
22075 viewport.width = 512;
22076 viewport.height = 512;
22077 viewport.x = 0;
22078 viewport.y = 0;
22079 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22080 vkEndCommandBuffer(command_buffer[1]);
22081 }
22082 {
22083 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022084 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022085
22086 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22087 submit_info[0].pNext = NULL;
22088 submit_info[0].commandBufferCount = 1;
22089 submit_info[0].pCommandBuffers = &command_buffer[0];
22090 submit_info[0].signalSemaphoreCount = 1;
22091 submit_info[0].pSignalSemaphores = &semaphore;
22092 submit_info[0].waitSemaphoreCount = 0;
22093 submit_info[0].pWaitSemaphores = NULL;
22094 submit_info[0].pWaitDstStageMask = 0;
22095
22096 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22097 submit_info[1].pNext = NULL;
22098 submit_info[1].commandBufferCount = 1;
22099 submit_info[1].pCommandBuffers = &command_buffer[1];
22100 submit_info[1].waitSemaphoreCount = 1;
22101 submit_info[1].pWaitSemaphores = &semaphore;
22102 submit_info[1].pWaitDstStageMask = flags;
22103 submit_info[1].signalSemaphoreCount = 0;
22104 submit_info[1].pSignalSemaphores = NULL;
22105 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
22106 }
22107
22108 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22109
22110 vkDestroyFence(m_device->device(), fence, nullptr);
22111 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22112 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22113 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22114
22115 m_errorMonitor->VerifyNotFound();
22116}
22117
22118TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
22119 m_errorMonitor->ExpectSuccess();
22120
Tony Barbour1fa09702017-03-16 12:09:08 -060022121 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022122 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22123
Tony Barbour552f6c02016-12-21 14:34:07 -070022124 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022125
22126 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
22127 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22128 m_errorMonitor->VerifyNotFound();
22129 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
22130 m_errorMonitor->VerifyNotFound();
22131 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22132 m_errorMonitor->VerifyNotFound();
22133
22134 m_commandBuffer->EndCommandBuffer();
22135 m_errorMonitor->VerifyNotFound();
22136}
22137
22138TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022139 TEST_DESCRIPTION(
22140 "Positive test where we create a renderpass with an "
22141 "attachment that uses LOAD_OP_CLEAR, the first subpass "
22142 "has a valid layout, and a second subpass then uses a "
22143 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022144 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060022145 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022146 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022147 if (!depth_format) {
22148 printf(" No Depth + Stencil format found. Skipped.\n");
22149 return;
22150 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022151
22152 VkAttachmentReference attach[2] = {};
22153 attach[0].attachment = 0;
22154 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22155 attach[1].attachment = 0;
22156 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22157 VkSubpassDescription subpasses[2] = {};
22158 // First subpass clears DS attach on load
22159 subpasses[0].pDepthStencilAttachment = &attach[0];
22160 // 2nd subpass reads in DS as input attachment
22161 subpasses[1].inputAttachmentCount = 1;
22162 subpasses[1].pInputAttachments = &attach[1];
22163 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070022164 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022165 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
22166 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
22167 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
22168 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22169 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22170 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22171 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22172 VkRenderPassCreateInfo rpci = {};
22173 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
22174 rpci.attachmentCount = 1;
22175 rpci.pAttachments = &attach_desc;
22176 rpci.subpassCount = 2;
22177 rpci.pSubpasses = subpasses;
22178
22179 // Now create RenderPass and verify no errors
22180 VkRenderPass rp;
22181 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
22182 m_errorMonitor->VerifyNotFound();
22183
22184 vkDestroyRenderPass(m_device->device(), rp, NULL);
22185}
22186
Tobin Ehlis01103de2017-02-16 13:22:47 -070022187TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
22188 TEST_DESCRIPTION(
22189 "Create a render pass with depth-stencil attachment where layout transition "
22190 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
22191 "transition has correctly occurred at queue submit time with no validation errors.");
22192
Tony Barbour1fa09702017-03-16 12:09:08 -060022193 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022194 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022195 if (!depth_format) {
22196 printf(" No Depth + Stencil format found. Skipped.\n");
22197 return;
22198 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070022199 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070022200 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022201 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
22202 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070022203 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070022204 return;
22205 }
22206
22207 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070022208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22209
22210 // A renderpass with one depth/stencil attachment.
22211 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070022212 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022213 VK_SAMPLE_COUNT_1_BIT,
22214 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22215 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22216 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22217 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22218 VK_IMAGE_LAYOUT_UNDEFINED,
22219 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22220
22221 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22222
22223 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
22224
22225 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
22226
22227 VkRenderPass rp;
22228 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22229 ASSERT_VK_SUCCESS(err);
22230 // A compatible ds image.
22231 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022232 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 -070022233 ASSERT_TRUE(image.initialized());
22234
22235 VkImageViewCreateInfo ivci = {
22236 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22237 nullptr,
22238 0,
22239 image.handle(),
22240 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022241 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022242 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22243 VK_COMPONENT_SWIZZLE_IDENTITY},
22244 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22245 };
22246 VkImageView view;
22247 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22248 ASSERT_VK_SUCCESS(err);
22249
22250 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22251 VkFramebuffer fb;
22252 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22253 ASSERT_VK_SUCCESS(err);
22254
22255 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22256 m_commandBuffer->BeginCommandBuffer();
22257 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22258 vkCmdEndRenderPass(m_commandBuffer->handle());
22259 m_commandBuffer->EndCommandBuffer();
22260 QueueCommandBuffer(false);
22261 m_errorMonitor->VerifyNotFound();
22262
22263 // Cleanup
22264 vkDestroyImageView(m_device->device(), view, NULL);
22265 vkDestroyRenderPass(m_device->device(), rp, NULL);
22266 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22267}
22268
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022269TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022270 TEST_DESCRIPTION(
22271 "Test that pipeline validation accepts matrices passed "
22272 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022273 m_errorMonitor->ExpectSuccess();
22274
Tony Barbour1fa09702017-03-16 12:09:08 -060022275 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022276 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22277
22278 VkVertexInputBindingDescription input_binding;
22279 memset(&input_binding, 0, sizeof(input_binding));
22280
22281 VkVertexInputAttributeDescription input_attribs[2];
22282 memset(input_attribs, 0, sizeof(input_attribs));
22283
22284 for (int i = 0; i < 2; i++) {
22285 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22286 input_attribs[i].location = i;
22287 }
22288
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022289 char const *vsSource =
22290 "#version 450\n"
22291 "\n"
22292 "layout(location=0) in mat2x4 x;\n"
22293 "out gl_PerVertex {\n"
22294 " vec4 gl_Position;\n"
22295 "};\n"
22296 "void main(){\n"
22297 " gl_Position = x[0] + x[1];\n"
22298 "}\n";
22299 char const *fsSource =
22300 "#version 450\n"
22301 "\n"
22302 "layout(location=0) out vec4 color;\n"
22303 "void main(){\n"
22304 " color = vec4(1);\n"
22305 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022306
22307 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22308 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22309
22310 VkPipelineObj pipe(m_device);
22311 pipe.AddColorAttachment();
22312 pipe.AddShader(&vs);
22313 pipe.AddShader(&fs);
22314
22315 pipe.AddVertexInputBindings(&input_binding, 1);
22316 pipe.AddVertexInputAttribs(input_attribs, 2);
22317
22318 VkDescriptorSetObj descriptorSet(m_device);
22319 descriptorSet.AppendDummy();
22320 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22321
22322 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22323
22324 /* expect success */
22325 m_errorMonitor->VerifyNotFound();
22326}
22327
22328TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22329 m_errorMonitor->ExpectSuccess();
22330
Tony Barbour1fa09702017-03-16 12:09:08 -060022331 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022332 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22333
22334 VkVertexInputBindingDescription input_binding;
22335 memset(&input_binding, 0, sizeof(input_binding));
22336
22337 VkVertexInputAttributeDescription input_attribs[2];
22338 memset(input_attribs, 0, sizeof(input_attribs));
22339
22340 for (int i = 0; i < 2; i++) {
22341 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22342 input_attribs[i].location = i;
22343 }
22344
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022345 char const *vsSource =
22346 "#version 450\n"
22347 "\n"
22348 "layout(location=0) in vec4 x[2];\n"
22349 "out gl_PerVertex {\n"
22350 " vec4 gl_Position;\n"
22351 "};\n"
22352 "void main(){\n"
22353 " gl_Position = x[0] + x[1];\n"
22354 "}\n";
22355 char const *fsSource =
22356 "#version 450\n"
22357 "\n"
22358 "layout(location=0) out vec4 color;\n"
22359 "void main(){\n"
22360 " color = vec4(1);\n"
22361 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022362
22363 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22364 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22365
22366 VkPipelineObj pipe(m_device);
22367 pipe.AddColorAttachment();
22368 pipe.AddShader(&vs);
22369 pipe.AddShader(&fs);
22370
22371 pipe.AddVertexInputBindings(&input_binding, 1);
22372 pipe.AddVertexInputAttribs(input_attribs, 2);
22373
22374 VkDescriptorSetObj descriptorSet(m_device);
22375 descriptorSet.AppendDummy();
22376 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22377
22378 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22379
22380 m_errorMonitor->VerifyNotFound();
22381}
22382
22383TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022384 TEST_DESCRIPTION(
22385 "Test that pipeline validation accepts consuming a vertex attribute "
22386 "through multiple vertex shader inputs, each consuming a different "
22387 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022388 m_errorMonitor->ExpectSuccess();
22389
Tony Barbour1fa09702017-03-16 12:09:08 -060022390 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22392
22393 VkVertexInputBindingDescription input_binding;
22394 memset(&input_binding, 0, sizeof(input_binding));
22395
22396 VkVertexInputAttributeDescription input_attribs[3];
22397 memset(input_attribs, 0, sizeof(input_attribs));
22398
22399 for (int i = 0; i < 3; i++) {
22400 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22401 input_attribs[i].location = i;
22402 }
22403
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022404 char const *vsSource =
22405 "#version 450\n"
22406 "\n"
22407 "layout(location=0) in vec4 x;\n"
22408 "layout(location=1) in vec3 y1;\n"
22409 "layout(location=1, component=3) in float y2;\n"
22410 "layout(location=2) in vec4 z;\n"
22411 "out gl_PerVertex {\n"
22412 " vec4 gl_Position;\n"
22413 "};\n"
22414 "void main(){\n"
22415 " gl_Position = x + vec4(y1, y2) + z;\n"
22416 "}\n";
22417 char const *fsSource =
22418 "#version 450\n"
22419 "\n"
22420 "layout(location=0) out vec4 color;\n"
22421 "void main(){\n"
22422 " color = vec4(1);\n"
22423 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022424
22425 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22426 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22427
22428 VkPipelineObj pipe(m_device);
22429 pipe.AddColorAttachment();
22430 pipe.AddShader(&vs);
22431 pipe.AddShader(&fs);
22432
22433 pipe.AddVertexInputBindings(&input_binding, 1);
22434 pipe.AddVertexInputAttribs(input_attribs, 3);
22435
22436 VkDescriptorSetObj descriptorSet(m_device);
22437 descriptorSet.AppendDummy();
22438 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22439
22440 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22441
22442 m_errorMonitor->VerifyNotFound();
22443}
22444
22445TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22446 m_errorMonitor->ExpectSuccess();
22447
Tony Barbour1fa09702017-03-16 12:09:08 -060022448 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22450
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022451 char const *vsSource =
22452 "#version 450\n"
22453 "out gl_PerVertex {\n"
22454 " vec4 gl_Position;\n"
22455 "};\n"
22456 "void main(){\n"
22457 " gl_Position = vec4(0);\n"
22458 "}\n";
22459 char const *fsSource =
22460 "#version 450\n"
22461 "\n"
22462 "layout(location=0) out vec4 color;\n"
22463 "void main(){\n"
22464 " color = vec4(1);\n"
22465 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022466
22467 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22468 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22469
22470 VkPipelineObj pipe(m_device);
22471 pipe.AddColorAttachment();
22472 pipe.AddShader(&vs);
22473 pipe.AddShader(&fs);
22474
22475 VkDescriptorSetObj descriptorSet(m_device);
22476 descriptorSet.AppendDummy();
22477 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22478
22479 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22480
22481 m_errorMonitor->VerifyNotFound();
22482}
22483
22484TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022485 TEST_DESCRIPTION(
22486 "Test that pipeline validation accepts the relaxed type matching rules "
22487 "set out in 14.1.3: fundamental type must match, and producer side must "
22488 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022489 m_errorMonitor->ExpectSuccess();
22490
22491 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22492
Tony Barbour1fa09702017-03-16 12:09:08 -060022493 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022494 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22495
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022496 char const *vsSource =
22497 "#version 450\n"
22498 "out gl_PerVertex {\n"
22499 " vec4 gl_Position;\n"
22500 "};\n"
22501 "layout(location=0) out vec3 x;\n"
22502 "layout(location=1) out ivec3 y;\n"
22503 "layout(location=2) out vec3 z;\n"
22504 "void main(){\n"
22505 " gl_Position = vec4(0);\n"
22506 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22507 "}\n";
22508 char const *fsSource =
22509 "#version 450\n"
22510 "\n"
22511 "layout(location=0) out vec4 color;\n"
22512 "layout(location=0) in float x;\n"
22513 "layout(location=1) flat in int y;\n"
22514 "layout(location=2) in vec2 z;\n"
22515 "void main(){\n"
22516 " color = vec4(1 + x + y + z.x);\n"
22517 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022518
22519 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22520 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22521
22522 VkPipelineObj pipe(m_device);
22523 pipe.AddColorAttachment();
22524 pipe.AddShader(&vs);
22525 pipe.AddShader(&fs);
22526
22527 VkDescriptorSetObj descriptorSet(m_device);
22528 descriptorSet.AppendDummy();
22529 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22530
22531 VkResult err = VK_SUCCESS;
22532 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22533 ASSERT_VK_SUCCESS(err);
22534
22535 m_errorMonitor->VerifyNotFound();
22536}
22537
22538TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022539 TEST_DESCRIPTION(
22540 "Test that pipeline validation accepts per-vertex variables "
22541 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022542 m_errorMonitor->ExpectSuccess();
22543
Tony Barbour1fa09702017-03-16 12:09:08 -060022544 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22546
22547 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022548 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022549 return;
22550 }
22551
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022552 char const *vsSource =
22553 "#version 450\n"
22554 "void main(){}\n";
22555 char const *tcsSource =
22556 "#version 450\n"
22557 "layout(location=0) out int x[];\n"
22558 "layout(vertices=3) out;\n"
22559 "void main(){\n"
22560 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22561 " gl_TessLevelInner[0] = 1;\n"
22562 " x[gl_InvocationID] = gl_InvocationID;\n"
22563 "}\n";
22564 char const *tesSource =
22565 "#version 450\n"
22566 "layout(triangles, equal_spacing, cw) in;\n"
22567 "layout(location=0) in int x[];\n"
22568 "out gl_PerVertex { vec4 gl_Position; };\n"
22569 "void main(){\n"
22570 " gl_Position.xyz = gl_TessCoord;\n"
22571 " gl_Position.w = x[0] + x[1] + x[2];\n"
22572 "}\n";
22573 char const *fsSource =
22574 "#version 450\n"
22575 "layout(location=0) out vec4 color;\n"
22576 "void main(){\n"
22577 " color = vec4(1);\n"
22578 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022579
22580 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22581 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22582 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22583 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22584
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022585 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22586 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022587
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022588 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022589
22590 VkPipelineObj pipe(m_device);
22591 pipe.SetInputAssembly(&iasci);
22592 pipe.SetTessellation(&tsci);
22593 pipe.AddColorAttachment();
22594 pipe.AddShader(&vs);
22595 pipe.AddShader(&tcs);
22596 pipe.AddShader(&tes);
22597 pipe.AddShader(&fs);
22598
22599 VkDescriptorSetObj descriptorSet(m_device);
22600 descriptorSet.AppendDummy();
22601 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22602
22603 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22604
22605 m_errorMonitor->VerifyNotFound();
22606}
22607
22608TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022609 TEST_DESCRIPTION(
22610 "Test that pipeline validation accepts a user-defined "
22611 "interface block passed into the geometry shader. This "
22612 "is interesting because the 'extra' array level is not "
22613 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022614 m_errorMonitor->ExpectSuccess();
22615
Tony Barbour1fa09702017-03-16 12:09:08 -060022616 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022617 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22618
22619 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022620 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022621 return;
22622 }
22623
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022624 char const *vsSource =
22625 "#version 450\n"
22626 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22627 "void main(){\n"
22628 " vs_out.x = vec4(1);\n"
22629 "}\n";
22630 char const *gsSource =
22631 "#version 450\n"
22632 "layout(triangles) in;\n"
22633 "layout(triangle_strip, max_vertices=3) out;\n"
22634 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22635 "out gl_PerVertex { vec4 gl_Position; };\n"
22636 "void main() {\n"
22637 " gl_Position = gs_in[0].x;\n"
22638 " EmitVertex();\n"
22639 "}\n";
22640 char const *fsSource =
22641 "#version 450\n"
22642 "layout(location=0) out vec4 color;\n"
22643 "void main(){\n"
22644 " color = vec4(1);\n"
22645 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022646
22647 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22648 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22649 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22650
22651 VkPipelineObj pipe(m_device);
22652 pipe.AddColorAttachment();
22653 pipe.AddShader(&vs);
22654 pipe.AddShader(&gs);
22655 pipe.AddShader(&fs);
22656
22657 VkDescriptorSetObj descriptorSet(m_device);
22658 descriptorSet.AppendDummy();
22659 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22660
22661 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22662
22663 m_errorMonitor->VerifyNotFound();
22664}
22665
22666TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022667 TEST_DESCRIPTION(
22668 "Test that pipeline validation accepts basic use of 64bit vertex "
22669 "attributes. This is interesting because they consume multiple "
22670 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022671 m_errorMonitor->ExpectSuccess();
22672
Tony Barbour1fa09702017-03-16 12:09:08 -060022673 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22675
22676 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022677 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022678 return;
22679 }
22680
22681 VkVertexInputBindingDescription input_bindings[1];
22682 memset(input_bindings, 0, sizeof(input_bindings));
22683
22684 VkVertexInputAttributeDescription input_attribs[4];
22685 memset(input_attribs, 0, sizeof(input_attribs));
22686 input_attribs[0].location = 0;
22687 input_attribs[0].offset = 0;
22688 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22689 input_attribs[1].location = 2;
22690 input_attribs[1].offset = 32;
22691 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22692 input_attribs[2].location = 4;
22693 input_attribs[2].offset = 64;
22694 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22695 input_attribs[3].location = 6;
22696 input_attribs[3].offset = 96;
22697 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22698
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022699 char const *vsSource =
22700 "#version 450\n"
22701 "\n"
22702 "layout(location=0) in dmat4 x;\n"
22703 "out gl_PerVertex {\n"
22704 " vec4 gl_Position;\n"
22705 "};\n"
22706 "void main(){\n"
22707 " gl_Position = vec4(x[0][0]);\n"
22708 "}\n";
22709 char const *fsSource =
22710 "#version 450\n"
22711 "\n"
22712 "layout(location=0) out vec4 color;\n"
22713 "void main(){\n"
22714 " color = vec4(1);\n"
22715 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022716
22717 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22718 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22719
22720 VkPipelineObj pipe(m_device);
22721 pipe.AddColorAttachment();
22722 pipe.AddShader(&vs);
22723 pipe.AddShader(&fs);
22724
22725 pipe.AddVertexInputBindings(input_bindings, 1);
22726 pipe.AddVertexInputAttribs(input_attribs, 4);
22727
22728 VkDescriptorSetObj descriptorSet(m_device);
22729 descriptorSet.AppendDummy();
22730 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22731
22732 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22733
22734 m_errorMonitor->VerifyNotFound();
22735}
22736
22737TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22738 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22739 m_errorMonitor->ExpectSuccess();
22740
Tony Barbour1fa09702017-03-16 12:09:08 -060022741 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022742
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022743 char const *vsSource =
22744 "#version 450\n"
22745 "\n"
22746 "out gl_PerVertex {\n"
22747 " vec4 gl_Position;\n"
22748 "};\n"
22749 "void main(){\n"
22750 " gl_Position = vec4(1);\n"
22751 "}\n";
22752 char const *fsSource =
22753 "#version 450\n"
22754 "\n"
22755 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22756 "layout(location=0) out vec4 color;\n"
22757 "void main() {\n"
22758 " color = subpassLoad(x);\n"
22759 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022760
22761 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22762 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22763
22764 VkPipelineObj pipe(m_device);
22765 pipe.AddShader(&vs);
22766 pipe.AddShader(&fs);
22767 pipe.AddColorAttachment();
22768 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22769
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022770 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22771 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022772 VkDescriptorSetLayout dsl;
22773 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22774 ASSERT_VK_SUCCESS(err);
22775
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022776 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022777 VkPipelineLayout pl;
22778 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22779 ASSERT_VK_SUCCESS(err);
22780
22781 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022782 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22783 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22784 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22785 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22786 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 -060022787 };
22788 VkAttachmentReference color = {
22789 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22790 };
22791 VkAttachmentReference input = {
22792 1, VK_IMAGE_LAYOUT_GENERAL,
22793 };
22794
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022795 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022796
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022797 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022798 VkRenderPass rp;
22799 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22800 ASSERT_VK_SUCCESS(err);
22801
22802 // should be OK. would go wrong here if it's going to...
22803 pipe.CreateVKPipeline(pl, rp);
22804
22805 m_errorMonitor->VerifyNotFound();
22806
22807 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22808 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22809 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22810}
22811
22812TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022813 TEST_DESCRIPTION(
22814 "Test that pipeline validation accepts a compute pipeline which declares a "
22815 "descriptor-backed resource which is not provided, but the shader does not "
22816 "statically use it. This is interesting because it requires compute pipelines "
22817 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022818 m_errorMonitor->ExpectSuccess();
22819
Tony Barbour1fa09702017-03-16 12:09:08 -060022820 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022821
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022822 char const *csSource =
22823 "#version 450\n"
22824 "\n"
22825 "layout(local_size_x=1) in;\n"
22826 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22827 "void main(){\n"
22828 " // x is not used.\n"
22829 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022830
22831 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22832
22833 VkDescriptorSetObj descriptorSet(m_device);
22834 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22835
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022836 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22837 nullptr,
22838 0,
22839 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22840 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22841 descriptorSet.GetPipelineLayout(),
22842 VK_NULL_HANDLE,
22843 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022844
22845 VkPipeline pipe;
22846 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22847
22848 m_errorMonitor->VerifyNotFound();
22849
22850 if (err == VK_SUCCESS) {
22851 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22852 }
22853}
22854
22855TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022856 TEST_DESCRIPTION(
22857 "Test that pipeline validation accepts a shader consuming only the "
22858 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022859 m_errorMonitor->ExpectSuccess();
22860
Tony Barbour1fa09702017-03-16 12:09:08 -060022861 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022862
22863 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022864 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22865 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22866 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022867 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022868 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022869 VkDescriptorSetLayout dsl;
22870 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22871 ASSERT_VK_SUCCESS(err);
22872
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022873 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022874 VkPipelineLayout pl;
22875 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22876 ASSERT_VK_SUCCESS(err);
22877
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022878 char const *csSource =
22879 "#version 450\n"
22880 "\n"
22881 "layout(local_size_x=1) in;\n"
22882 "layout(set=0, binding=0) uniform sampler s;\n"
22883 "layout(set=0, binding=1) uniform texture2D t;\n"
22884 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22885 "void main() {\n"
22886 " x = texture(sampler2D(t, s), vec2(0));\n"
22887 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022888 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22889
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022890 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22891 nullptr,
22892 0,
22893 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22894 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22895 pl,
22896 VK_NULL_HANDLE,
22897 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022898
22899 VkPipeline pipe;
22900 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22901
22902 m_errorMonitor->VerifyNotFound();
22903
22904 if (err == VK_SUCCESS) {
22905 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22906 }
22907
22908 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22909 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22910}
22911
22912TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022913 TEST_DESCRIPTION(
22914 "Test that pipeline validation accepts a shader consuming only the "
22915 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022916 m_errorMonitor->ExpectSuccess();
22917
Tony Barbour1fa09702017-03-16 12:09:08 -060022918 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022919
22920 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022921 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22922 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22923 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022924 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022925 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022926 VkDescriptorSetLayout dsl;
22927 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22928 ASSERT_VK_SUCCESS(err);
22929
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022930 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022931 VkPipelineLayout pl;
22932 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22933 ASSERT_VK_SUCCESS(err);
22934
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022935 char const *csSource =
22936 "#version 450\n"
22937 "\n"
22938 "layout(local_size_x=1) in;\n"
22939 "layout(set=0, binding=0) uniform texture2D t;\n"
22940 "layout(set=0, binding=1) uniform sampler s;\n"
22941 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22942 "void main() {\n"
22943 " x = texture(sampler2D(t, s), vec2(0));\n"
22944 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022945 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22946
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022947 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22948 nullptr,
22949 0,
22950 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22951 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22952 pl,
22953 VK_NULL_HANDLE,
22954 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022955
22956 VkPipeline pipe;
22957 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22958
22959 m_errorMonitor->VerifyNotFound();
22960
22961 if (err == VK_SUCCESS) {
22962 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22963 }
22964
22965 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22966 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22967}
22968
22969TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022970 TEST_DESCRIPTION(
22971 "Test that pipeline validation accepts a shader consuming "
22972 "both the sampler and the image of a combined image+sampler "
22973 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022974 m_errorMonitor->ExpectSuccess();
22975
Tony Barbour1fa09702017-03-16 12:09:08 -060022976 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022977
22978 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022979 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22980 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022981 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022982 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022983 VkDescriptorSetLayout dsl;
22984 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22985 ASSERT_VK_SUCCESS(err);
22986
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022987 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022988 VkPipelineLayout pl;
22989 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22990 ASSERT_VK_SUCCESS(err);
22991
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022992 char const *csSource =
22993 "#version 450\n"
22994 "\n"
22995 "layout(local_size_x=1) in;\n"
22996 "layout(set=0, binding=0) uniform texture2D t;\n"
22997 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22998 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22999 "void main() {\n"
23000 " x = texture(sampler2D(t, s), vec2(0));\n"
23001 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023002 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23003
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023004 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23005 nullptr,
23006 0,
23007 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23008 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23009 pl,
23010 VK_NULL_HANDLE,
23011 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023012
23013 VkPipeline pipe;
23014 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23015
23016 m_errorMonitor->VerifyNotFound();
23017
23018 if (err == VK_SUCCESS) {
23019 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23020 }
23021
23022 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23023 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23024}
23025
Tony Barbour3ed87a02017-03-15 16:19:02 -060023026TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023027 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23028
Tony Barbour3ed87a02017-03-15 16:19:02 -060023029 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023030 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023031
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023032 // Ensure that extension is available and enabled.
23033 uint32_t extension_count = 0;
23034 bool supports_maintenance1_extension = false;
23035 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23036 ASSERT_VK_SUCCESS(err);
23037 if (extension_count > 0) {
23038 std::vector<VkExtensionProperties> available_extensions(extension_count);
23039
23040 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23041 ASSERT_VK_SUCCESS(err);
23042 for (const auto &extension_props : available_extensions) {
23043 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23044 supports_maintenance1_extension = true;
23045 }
23046 }
23047 }
23048
23049 // Proceed if extension is supported by hardware
23050 if (!supports_maintenance1_extension) {
23051 printf(" Maintenance1 Extension not supported, skipping tests\n");
23052 return;
23053 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023054
23055 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023056 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023057 VkCommandBuffer cmd_buf;
23058 VkCommandBufferAllocateInfo alloc_info;
23059 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23060 alloc_info.pNext = NULL;
23061 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023062 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023063 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23064 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23065
23066 VkCommandBufferBeginInfo cb_binfo;
23067 cb_binfo.pNext = NULL;
23068 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23069 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23070 cb_binfo.flags = 0;
23071 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23072 // Set Negative height, should give error if Maintenance 1 is not enabled
23073 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23074 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23075 vkEndCommandBuffer(cmd_buf);
23076
23077 m_errorMonitor->VerifyNotFound();
23078}
23079
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023080TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23081 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23082
23083 ASSERT_NO_FATAL_FAILURE(Init());
23084
23085 uint32_t extension_count = 0;
23086 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23087 ASSERT_VK_SUCCESS(err);
23088
23089 if (extension_count > 0) {
23090 std::vector<VkExtensionProperties> available_extensions(extension_count);
23091 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23092 ASSERT_VK_SUCCESS(err);
23093
23094 for (const auto &extension_props : available_extensions) {
23095 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23096 // Create two pNext structures which by themselves would be valid
23097 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23098 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23099 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23100 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
23101 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23102
23103 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23104 dedicated_buffer_create_info_2.pNext = nullptr;
23105 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
23106
23107 uint32_t queue_family_index = 0;
23108 VkBufferCreateInfo buffer_create_info = {};
23109 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23110 buffer_create_info.pNext = &dedicated_buffer_create_info;
23111 buffer_create_info.size = 1024;
23112 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23113 buffer_create_info.queueFamilyIndexCount = 1;
23114 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23115
23116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
23117 VkBuffer buffer;
23118 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
23119 m_errorMonitor->VerifyFound();
23120 }
23121 }
23122 }
23123}
23124
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023125TEST_F(VkPositiveLayerTest, ValidStructPNext) {
23126 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
23127
Tony Barbour1fa09702017-03-16 12:09:08 -060023128 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023129
23130 // Positive test to check parameter_validation and unique_objects support
23131 // for NV_dedicated_allocation
23132 uint32_t extension_count = 0;
23133 bool supports_nv_dedicated_allocation = false;
23134 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23135 ASSERT_VK_SUCCESS(err);
23136
23137 if (extension_count > 0) {
23138 std::vector<VkExtensionProperties> available_extensions(extension_count);
23139
23140 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23141 ASSERT_VK_SUCCESS(err);
23142
23143 for (const auto &extension_props : available_extensions) {
23144 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23145 supports_nv_dedicated_allocation = true;
23146 }
23147 }
23148 }
23149
23150 if (supports_nv_dedicated_allocation) {
23151 m_errorMonitor->ExpectSuccess();
23152
23153 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23154 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23155 dedicated_buffer_create_info.pNext = nullptr;
23156 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23157
23158 uint32_t queue_family_index = 0;
23159 VkBufferCreateInfo buffer_create_info = {};
23160 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23161 buffer_create_info.pNext = &dedicated_buffer_create_info;
23162 buffer_create_info.size = 1024;
23163 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23164 buffer_create_info.queueFamilyIndexCount = 1;
23165 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23166
23167 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070023168 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023169 ASSERT_VK_SUCCESS(err);
23170
23171 VkMemoryRequirements memory_reqs;
23172 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
23173
23174 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
23175 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
23176 dedicated_memory_info.pNext = nullptr;
23177 dedicated_memory_info.buffer = buffer;
23178 dedicated_memory_info.image = VK_NULL_HANDLE;
23179
23180 VkMemoryAllocateInfo memory_info = {};
23181 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
23182 memory_info.pNext = &dedicated_memory_info;
23183 memory_info.allocationSize = memory_reqs.size;
23184
23185 bool pass;
23186 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
23187 ASSERT_TRUE(pass);
23188
23189 VkDeviceMemory buffer_memory;
23190 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
23191 ASSERT_VK_SUCCESS(err);
23192
23193 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
23194 ASSERT_VK_SUCCESS(err);
23195
23196 vkDestroyBuffer(m_device->device(), buffer, NULL);
23197 vkFreeMemory(m_device->device(), buffer_memory, NULL);
23198
23199 m_errorMonitor->VerifyNotFound();
23200 }
23201}
23202
23203TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
23204 VkResult err;
23205
23206 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
23207
Tony Barbour1fa09702017-03-16 12:09:08 -060023208 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023209 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23210
23211 std::vector<const char *> device_extension_names;
23212 auto features = m_device->phy().features();
23213 // Artificially disable support for non-solid fill modes
23214 features.fillModeNonSolid = false;
23215 // The sacrificial device object
23216 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
23217
23218 VkRenderpassObj render_pass(&test_device);
23219
23220 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
23221 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
23222 pipeline_layout_ci.setLayoutCount = 0;
23223 pipeline_layout_ci.pSetLayouts = NULL;
23224
23225 VkPipelineLayout pipeline_layout;
23226 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
23227 ASSERT_VK_SUCCESS(err);
23228
23229 VkPipelineRasterizationStateCreateInfo rs_ci = {};
23230 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
23231 rs_ci.pNext = nullptr;
23232 rs_ci.lineWidth = 1.0f;
23233 rs_ci.rasterizerDiscardEnable = true;
23234
23235 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
23236 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23237
23238 // Set polygonMode=FILL. No error is expected
23239 m_errorMonitor->ExpectSuccess();
23240 {
23241 VkPipelineObj pipe(&test_device);
23242 pipe.AddShader(&vs);
23243 pipe.AddShader(&fs);
23244 pipe.AddColorAttachment();
23245 // Set polygonMode to a good value
23246 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23247 pipe.SetRasterization(&rs_ci);
23248 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23249 }
23250 m_errorMonitor->VerifyNotFound();
23251
23252 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23253}
23254
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023255#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023256TEST_F(VkPositiveLayerTest, LongFenceChain)
23257{
23258 m_errorMonitor->ExpectSuccess();
23259
Tony Barbour1fa09702017-03-16 12:09:08 -060023260 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023261 VkResult err;
23262
23263 std::vector<VkFence> fences;
23264
23265 const int chainLength = 32768;
23266
23267 for (int i = 0; i < chainLength; i++) {
23268 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23269 VkFence fence;
23270 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23271 ASSERT_VK_SUCCESS(err);
23272
23273 fences.push_back(fence);
23274
23275 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23276 0, nullptr, 0, nullptr };
23277 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23278 ASSERT_VK_SUCCESS(err);
23279
23280 }
23281
23282 // BOOM, stack overflow.
23283 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23284
23285 for (auto fence : fences)
23286 vkDestroyFence(m_device->device(), fence, nullptr);
23287
23288 m_errorMonitor->VerifyNotFound();
23289}
23290#endif
23291
Cody Northrop1242dfd2016-07-13 17:24:59 -060023292#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060023293const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023294static bool initialized = false;
23295static bool active = false;
23296
23297// Convert Intents to argv
23298// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023299std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023300 std::vector<std::string> args;
23301 JavaVM &vm = *app.activity->vm;
23302 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023303 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023304
23305 JNIEnv &env = *p_env;
23306 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023307 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023308 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023309 jmethodID get_string_extra_method =
23310 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023311 jvalue get_string_extra_args;
23312 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023313 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023314
23315 std::string args_str;
23316 if (extra_str) {
23317 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23318 args_str = extra_utf;
23319 env.ReleaseStringUTFChars(extra_str, extra_utf);
23320 env.DeleteLocalRef(extra_str);
23321 }
23322
23323 env.DeleteLocalRef(get_string_extra_args.l);
23324 env.DeleteLocalRef(intent);
23325 vm.DetachCurrentThread();
23326
23327 // split args_str
23328 std::stringstream ss(args_str);
23329 std::string arg;
23330 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023331 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023332 }
23333
23334 return args;
23335}
23336
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023337void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
23338 const char *const type_param = test_info.type_param();
23339 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060023340
23341 if (type_param != NULL || value_param != NULL) {
23342 error_message.append(", where ");
23343 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023344 error_message.append("TypeParam = ").append(type_param);
23345 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060023346 }
23347 if (value_param != NULL) {
23348 error_message.append("GetParam() = ").append(value_param);
23349 }
23350 }
23351}
23352
23353// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
23354class LogcatPrinter : public ::testing::EmptyTestEventListener {
23355 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023356 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023357 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
23358 }
23359
23360 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023361 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060023362 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023363 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060023364
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023365 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
23366 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060023367 }
23368
23369 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023370 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023371 std::string result;
23372 if (info.result()->Passed()) {
23373 result.append("[ OK ]");
23374 } else {
23375 result.append("[ FAILED ]");
23376 }
23377 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023378 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060023379
23380 if (::testing::GTEST_FLAG(print_time)) {
23381 std::ostringstream os;
23382 os << info.result()->elapsed_time();
23383 result.append(" (").append(os.str()).append(" ms)");
23384 }
23385
23386 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
23387 };
23388};
23389
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023390static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023391
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023392static void processCommand(struct android_app *app, int32_t cmd) {
23393 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023394 case APP_CMD_INIT_WINDOW: {
23395 if (app->window) {
23396 initialized = true;
23397 }
23398 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023399 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023400 case APP_CMD_GAINED_FOCUS: {
23401 active = true;
23402 break;
23403 }
23404 case APP_CMD_LOST_FOCUS: {
23405 active = false;
23406 break;
23407 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023408 }
23409}
23410
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023411void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023412 app_dummy();
23413
Cody Northrop1242dfd2016-07-13 17:24:59 -060023414 int vulkanSupport = InitVulkan();
23415 if (vulkanSupport == 0) {
23416 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23417 return;
23418 }
23419
23420 app->onAppCmd = processCommand;
23421 app->onInputEvent = processInput;
23422
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023423 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023424 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023425 struct android_poll_source *source;
23426 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023427 if (source) {
23428 source->process(app, source);
23429 }
23430
23431 if (app->destroyRequested != 0) {
23432 VkTestFramework::Finish();
23433 return;
23434 }
23435 }
23436
23437 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023438 // Use the following key to send arguments to gtest, i.e.
23439 // --es args "--gtest_filter=-VkLayerTest.foo"
23440 const char key[] = "args";
23441 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023442
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023443 std::string filter = "";
23444 if (args.size() > 0) {
23445 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23446 filter += args[0];
23447 } else {
23448 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23449 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023450
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023451 int argc = 2;
23452 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23453 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023454
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023455 // Route output to files until we can override the gtest output
23456 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23457 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023458
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023459 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060023460
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023461 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060023462 listeners.Append(new LogcatPrinter);
23463
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023464 VkTestFramework::InitArgs(&argc, argv);
23465 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023466
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023467 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023468
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023469 if (result != 0) {
23470 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23471 } else {
23472 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23473 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023474
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023475 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023476
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023477 fclose(stdout);
23478 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023479
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023480 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023481 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023482 }
23483 }
23484}
23485#endif
23486
Tony Barbour300a6082015-04-07 13:44:53 -060023487int main(int argc, char **argv) {
23488 int result;
23489
Cody Northrop8e54a402016-03-08 22:25:52 -070023490#ifdef ANDROID
23491 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023492 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023493#endif
23494
Tony Barbour300a6082015-04-07 13:44:53 -060023495 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023496 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023497
23498 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23499
23500 result = RUN_ALL_TESTS();
23501
Tony Barbour6918cd52015-04-09 12:58:51 -060023502 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023503 return result;
23504}