blob: ad8d6a2df01f9b9be93270b360ac0d56ae54afb8 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Dave Houltonc85c4a82017-04-25 15:56:45 -0600341#ifdef _DEBUG
342 char embedded_code_string[2048];
343 snprintf(embedded_code_string, 2048, "%s [%05d]", pMsg, msgCode);
344 return errMonitor->CheckForDesiredMsg(msgCode, embedded_code_string);
345#else
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600346 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Dave Houltonc85c4a82017-04-25 15:56:45 -0600347#endif
Tony Barbour0b4d9562015-04-09 10:48:04 -0600348 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600349 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600350}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500351
Karl Schultz6addd812016-02-02 17:17:23 -0700352class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700353 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600354 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
355 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700356 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600357 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
358 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700359 }
Tony Barbour300a6082015-04-07 13:44:53 -0600360
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600361 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
362 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700363 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600364 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700365 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600366 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700367 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600368 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
369 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
370 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700371 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
372 }
373 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
374 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
375 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600376 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
378 InitState(features, flags);
379 }
380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700381 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700382 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600384 std::vector<const char *> instance_layer_names;
385 std::vector<const char *> instance_extension_names;
386 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600387
388 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700389 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600390 /*
391 * Since CreateDbgMsgCallback is an instance level extension call
392 * any extension / layer that utilizes that feature also needs
393 * to be enabled at create instance time.
394 */
Karl Schultz6addd812016-02-02 17:17:23 -0700395 // Use Threading layer first to protect others from
396 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700397 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600398 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800399 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700400 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600401 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700402 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600403
Ian Elliott2c1daf52016-05-12 09:41:46 -0600404 if (m_enableWSI) {
405 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
406 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
407#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
408#if defined(VK_USE_PLATFORM_ANDROID_KHR)
409 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_MIR_KHR)
412 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600414#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
415 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700416#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600417#if defined(VK_USE_PLATFORM_WIN32_KHR)
418 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_WIN32_KHR
420#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600421#if defined(VK_USE_PLATFORM_XCB_KHR)
422 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
423#elif defined(VK_USE_PLATFORM_XLIB_KHR)
424 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700425#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600426 }
427
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600428 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600429 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800430 this->app_info.pApplicationName = "layer_tests";
431 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600432 this->app_info.pEngineName = "unittest";
433 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600434 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600435
Tony Barbour15524c32015-04-29 17:34:29 -0600436 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
438
439 virtual void TearDown() {
440 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600441 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600442 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600443 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600444
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600445 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600446};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500447
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600448void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449 // Create identity matrix
450 int i;
451 struct vktriangle_vs_uniform data;
452
453 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700454 glm::mat4 View = glm::mat4(1.0f);
455 glm::mat4 Model = glm::mat4(1.0f);
456 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700458 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
460 memcpy(&data.mvp, &MVP[0][0], matrixSize);
461
Karl Schultz6addd812016-02-02 17:17:23 -0700462 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600463 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500464 };
465
Karl Schultz6addd812016-02-02 17:17:23 -0700466 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 data.position[i][0] = tri_data[i].posX;
468 data.position[i][1] = tri_data[i].posY;
469 data.position[i][2] = tri_data[i].posZ;
470 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700471 data.color[i][0] = tri_data[i].r;
472 data.color[i][1] = tri_data[i].g;
473 data.color[i][2] = tri_data[i].b;
474 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475 }
476
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477 ASSERT_NO_FATAL_FAILURE(InitViewport());
478
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200479 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
480 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Karl Schultz6addd812016-02-02 17:17:23 -0700482 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600483 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484
485 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800486 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500487 pipelineobj.AddShader(&vs);
488 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 if (failMask & BsoFailLineWidth) {
490 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600491 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600492 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
494 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600495 }
496 if (failMask & BsoFailDepthBias) {
497 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600498 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600499 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600500 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600501 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600502 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600503 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700504 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700505 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600506 if (failMask & BsoFailViewport) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
508 }
509 if (failMask & BsoFailScissor) {
510 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
511 }
512 if (failMask & BsoFailBlend) {
513 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600514 VkPipelineColorBlendAttachmentState att_state = {};
515 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
516 att_state.blendEnable = VK_TRUE;
517 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600518 }
519 if (failMask & BsoFailDepthBounds) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
521 }
522 if (failMask & BsoFailStencilReadMask) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
524 }
525 if (failMask & BsoFailStencilWriteMask) {
526 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
527 }
528 if (failMask & BsoFailStencilReference) {
529 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
530 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500531
532 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600533 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700536 m_commandBuffer->BeginCommandBuffer();
537 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538
Tony Barbourfe3351b2015-07-28 10:17:20 -0600539 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500540
541 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600542 if (failMask & BsoFailIndexBuffer) {
543 // Use DrawIndexed w/o an index buffer bound
544 DrawIndexed(3, 1, 0, 0, 0);
545 } else {
546 Draw(3, 1, 0, 0);
547 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500548
Mark Muellerd4914412016-06-13 17:52:06 -0600549 if (failMask & BsoFailCmdClearAttachments) {
550 VkClearAttachment color_attachment = {};
551 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700552 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600553 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
554
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600555 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600556 }
557
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500558 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700559 m_commandBuffer->EndRenderPass();
560 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600561 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562}
563
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600564void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
565 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500566 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600567 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500568 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600569 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500570 }
571
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800572 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700573 // Make sure depthWriteEnable is set so that Depth fail test will work
574 // correctly
575 // Make sure stencilTestEnable is set so that Stencil fail test will work
576 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600577 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800578 stencil.failOp = VK_STENCIL_OP_KEEP;
579 stencil.passOp = VK_STENCIL_OP_KEEP;
580 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
581 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600582
583 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
584 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600585 ds_ci.pNext = NULL;
586 ds_ci.depthTestEnable = VK_FALSE;
587 ds_ci.depthWriteEnable = VK_TRUE;
588 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
589 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600590 if (failMask & BsoFailDepthBounds) {
591 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600592 ds_ci.maxDepthBounds = 0.0f;
593 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600594 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600595 ds_ci.stencilTestEnable = VK_TRUE;
596 ds_ci.front = stencil;
597 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600598
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600599 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600600 pipelineobj.SetViewport(m_viewports);
601 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800602 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600603 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600604 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 commandBuffer->BindPipeline(pipelineobj);
606 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500607}
608
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600609class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700610 public:
611 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600612};
613
Ian Elliott2c1daf52016-05-12 09:41:46 -0600614class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
616 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600617 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600618};
619
Mark Muellerdfe37552016-07-07 14:47:42 -0600620class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700621 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600622 enum eTestEnFlags {
623 eDoubleDelete,
624 eInvalidDeviceOffset,
625 eInvalidMemoryOffset,
626 eBindNullBuffer,
627 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600628 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 };
630
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600631 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600632
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
634 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635 return true;
636 }
637 VkDeviceSize offset_limit = 0;
638 if (eInvalidMemoryOffset == aTestFlag) {
639 VkBuffer vulkanBuffer;
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600646 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600647
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
650 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600651 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
652 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600653 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600654 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600655 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600656 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 }
658 if (eOffsetAlignment < offset_limit) {
659 return true;
660 }
661 return false;
662 }
663
664 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
666 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (eBindNullBuffer == aTestFlag) {
668 VulkanMemory = 0;
669 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
670 } else {
671 VkBufferCreateInfo buffer_create_info = {};
672 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
673 buffer_create_info.size = 32;
674 buffer_create_info.usage = aBufferUsage;
675
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600676 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677
678 CreateCurrent = true;
679
680 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600681 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682
683 VkMemoryAllocateInfo memory_allocate_info = {};
684 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800685 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600686 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
687 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 if (!pass) {
689 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
690 return;
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600694 AllocateCurrent = true;
695 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600696 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
697 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 BoundCurrent = true;
699
700 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
701 }
702 }
703
704 ~VkBufferTest() {
705 if (CreateCurrent) {
706 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
707 }
708 if (AllocateCurrent) {
709 if (InvalidDeleteEn) {
710 union {
711 VkDeviceMemory device_memory;
712 unsigned long long index_access;
713 } bad_index;
714
715 bad_index.device_memory = VulkanMemory;
716 bad_index.index_access++;
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 }
720 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
721 }
722 }
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600725
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600727
728 void TestDoubleDestroy() {
729 // Destroy the buffer but leave the flag set, which will cause
730 // the buffer to be destroyed again in the destructor.
731 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
732 }
733
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700734 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600735 bool AllocateCurrent;
736 bool BoundCurrent;
737 bool CreateCurrent;
738 bool InvalidDeleteEn;
739
740 VkBuffer VulkanBuffer;
741 VkDevice VulkanDevice;
742 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600743};
744
745class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700746 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600747 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600748 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700749 : BoundCurrent(false),
750 AttributeCount(aAttributeCount),
751 BindingCount(aBindingCount),
752 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600753 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600754 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
755 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700756 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600757
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600758 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
759 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
762 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
763 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
764 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
765 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600766
767 unsigned i = 0;
768 do {
769 VertexInputAttributeDescription[i].binding = BindId;
770 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600771 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
772 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600773 i++;
774 } while (AttributeCount < i);
775
776 i = 0;
777 do {
778 VertexInputBindingDescription[i].binding = BindId;
779 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600780 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600781 i++;
782 } while (BindingCount < i);
783 }
784
785 ~VkVerticesObj() {
786 if (VertexInputAttributeDescription) {
787 delete[] VertexInputAttributeDescription;
788 }
789 if (VertexInputBindingDescription) {
790 delete[] VertexInputBindingDescription;
791 }
792 }
793
794 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
796 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600797 return true;
798 }
799
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600800 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600801 VkDeviceSize *offsetList;
802 unsigned offsetCount;
803
804 if (aOffsetCount) {
805 offsetList = aOffsetList;
806 offsetCount = aOffsetCount;
807 } else {
808 offsetList = new VkDeviceSize[1]();
809 offsetCount = 1;
810 }
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600813 BoundCurrent = true;
814
815 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600816 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600817 }
818 }
819
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700820 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600821 static uint32_t BindIdGenerator;
822
823 bool BoundCurrent;
824 unsigned AttributeCount;
825 unsigned BindingCount;
826 uint32_t BindId;
827
828 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
829 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
830 VkVertexInputBindingDescription *VertexInputBindingDescription;
831 VkConstantBufferObj VulkanMemoryBuffer;
832};
833
834uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500835// ********************************************************************************************************************
836// ********************************************************************************************************************
837// ********************************************************************************************************************
838// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700840 TEST_DESCRIPTION(
841 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
842 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600843
Tony Barbour1fa09702017-03-16 12:09:08 -0600844 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a pointer to a handle
848 // Expected to trigger an error with
849 // parameter_validation::validate_required_pointer
850 vkGetPhysicalDeviceFeatures(gpu(), NULL);
851 m_errorMonitor->VerifyFound();
852
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
854 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify NULL for pointer to array count
856 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600857 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600858 m_errorMonitor->VerifyFound();
859
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify 0 for a required array count
862 // Expected to trigger an error with parameter_validation::validate_array
863 VkViewport view_port = {};
864 m_commandBuffer->SetViewport(0, 0, &view_port);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify NULL for a required array
869 // Expected to trigger an error with parameter_validation::validate_array
870 m_commandBuffer->SetViewport(0, 1, NULL);
871 m_errorMonitor->VerifyFound();
872
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600874 // Specify VK_NULL_HANDLE for a required handle
875 // Expected to trigger an error with
876 // parameter_validation::validate_required_handle
877 vkUnmapMemory(device(), VK_NULL_HANDLE);
878 m_errorMonitor->VerifyFound();
879
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
881 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882 // Specify VK_NULL_HANDLE for a required handle array entry
883 // Expected to trigger an error with
884 // parameter_validation::validate_required_handle_array
885 VkFence fence = VK_NULL_HANDLE;
886 vkResetFences(device(), 1, &fence);
887 m_errorMonitor->VerifyFound();
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags parameter
899 // Expected to trigger an error with parameter_validation::validate_flags
900 m_commandBuffer->SetStencilReference(0, 0);
901 m_errorMonitor->VerifyFound();
902
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600904 // Specify 0 for a required VkFlags array entry
905 // Expected to trigger an error with
906 // parameter_validation::validate_flags_array
907 VkSemaphore semaphore = VK_NULL_HANDLE;
908 VkPipelineStageFlags stageFlags = 0;
909 VkSubmitInfo submitInfo = {};
910 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
911 submitInfo.waitSemaphoreCount = 1;
912 submitInfo.pWaitSemaphores = &semaphore;
913 submitInfo.pWaitDstStageMask = &stageFlags;
914 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
915 m_errorMonitor->VerifyFound();
916}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600917
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918TEST_F(VkLayerTest, ReservedParameter) {
919 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
920
Tony Barbour1fa09702017-03-16 12:09:08 -0600921 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600922
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600924 // Specify 0 for a reserved VkFlags parameter
925 // Expected to trigger an error with
926 // parameter_validation::validate_reserved_flags
927 VkEvent event_handle = VK_NULL_HANDLE;
928 VkEventCreateInfo event_info = {};
929 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
930 event_info.flags = 1;
931 vkCreateEvent(device(), &event_info, NULL, &event_handle);
932 m_errorMonitor->VerifyFound();
933}
934
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700936 TEST_DESCRIPTION(
937 "Specify an invalid VkStructureType for a Vulkan "
938 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939
Tony Barbour1fa09702017-03-16 12:09:08 -0600940 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600941
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943 // Zero struct memory, effectively setting sType to
944 // VK_STRUCTURE_TYPE_APPLICATION_INFO
945 // Expected to trigger an error with
946 // parameter_validation::validate_struct_type
947 VkMemoryAllocateInfo alloc_info = {};
948 VkDeviceMemory memory = VK_NULL_HANDLE;
949 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
950 m_errorMonitor->VerifyFound();
951
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600953 // Zero struct memory, effectively setting sType to
954 // VK_STRUCTURE_TYPE_APPLICATION_INFO
955 // Expected to trigger an error with
956 // parameter_validation::validate_struct_type_array
957 VkSubmitInfo submit_info = {};
958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
959 m_errorMonitor->VerifyFound();
960}
961
962TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600963 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600964
Tony Barbour1fa09702017-03-16 12:09:08 -0600965 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600966
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600968 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600969 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600970 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600971 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600972 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600973 // Zero-initialization will provide the correct sType
974 VkApplicationInfo app_info = {};
975 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
976 event_alloc_info.pNext = &app_info;
977 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
978 m_errorMonitor->VerifyFound();
979
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
981 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600982 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
983 // a function that has allowed pNext structure types and specify
984 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600985 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600987 VkMemoryAllocateInfo memory_alloc_info = {};
988 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
989 memory_alloc_info.pNext = &app_info;
990 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600991 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600992}
Dustin Graves5d33d532016-05-09 16:21:12 -0600993
994TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600995 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600996
Tony Barbour1fa09702017-03-16 12:09:08 -0600997 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1000 "does not fall within the begin..end "
1001 "range of the core VkFormat "
1002 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 // Specify an invalid VkFormat value
1004 // Expected to trigger an error with
1005 // parameter_validation::validate_ranged_enum
1006 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001007 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001008 m_errorMonitor->VerifyFound();
1009
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001011 // Specify an invalid VkFlags bitmask value
1012 // Expected to trigger an error with parameter_validation::validate_flags
1013 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001014 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1015 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001016 m_errorMonitor->VerifyFound();
1017
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001019 // Specify an invalid VkFlags array entry
1020 // Expected to trigger an error with
1021 // parameter_validation::validate_flags_array
1022 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001023 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001024 VkSubmitInfo submit_info = {};
1025 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1026 submit_info.waitSemaphoreCount = 1;
1027 submit_info.pWaitSemaphores = &semaphore;
1028 submit_info.pWaitDstStageMask = &stage_flags;
1029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1030 m_errorMonitor->VerifyFound();
1031
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001033 // Specify an invalid VkBool32 value
1034 // Expected to trigger a warning with
1035 // parameter_validation::validate_bool32
1036 VkSampler sampler = VK_NULL_HANDLE;
1037 VkSamplerCreateInfo sampler_info = {};
1038 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1039 sampler_info.pNext = NULL;
1040 sampler_info.magFilter = VK_FILTER_NEAREST;
1041 sampler_info.minFilter = VK_FILTER_NEAREST;
1042 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1043 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1044 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1045 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1046 sampler_info.mipLodBias = 1.0;
1047 sampler_info.maxAnisotropy = 1;
1048 sampler_info.compareEnable = VK_FALSE;
1049 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1050 sampler_info.minLod = 1.0;
1051 sampler_info.maxLod = 1.0;
1052 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1053 sampler_info.unnormalizedCoordinates = VK_FALSE;
1054 // Not VK_TRUE or VK_FALSE
1055 sampler_info.anisotropyEnable = 3;
1056 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1057 m_errorMonitor->VerifyFound();
1058}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001059
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001060TEST_F(VkLayerTest, UpdateBufferAlignment) {
1061 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001062 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001063
Tony Barbour1fa09702017-03-16 12:09:08 -06001064 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001065
1066 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1067 vk_testing::Buffer buffer;
1068 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1069
Tony Barbour552f6c02016-12-21 14:34:07 -07001070 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001071 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1074 m_errorMonitor->VerifyFound();
1075
1076 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001078 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1079 m_errorMonitor->VerifyFound();
1080
1081 // Introduce failure by using dataSize that is < 0
1082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001083 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001084 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1085 m_errorMonitor->VerifyFound();
1086
1087 // Introduce failure by using dataSize that is > 65536
1088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001089 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1091 m_errorMonitor->VerifyFound();
1092
Tony Barbour552f6c02016-12-21 14:34:07 -07001093 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094}
1095
1096TEST_F(VkLayerTest, FillBufferAlignment) {
1097 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1098
Tony Barbour1fa09702017-03-16 12:09:08 -06001099 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001100
1101 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1102 vk_testing::Buffer buffer;
1103 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1104
Tony Barbour552f6c02016-12-21 14:34:07 -07001105 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001106
1107 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001114 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1115 m_errorMonitor->VerifyFound();
1116
1117 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1120 m_errorMonitor->VerifyFound();
1121
Tony Barbour552f6c02016-12-21 14:34:07 -07001122 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001123}
Dustin Graves40f35822016-06-23 11:12:53 -06001124
Cortd889ff92016-07-27 09:51:27 -07001125TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1126 VkResult err;
1127
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001128 TEST_DESCRIPTION(
1129 "Attempt to use a non-solid polygon fill mode in a "
1130 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001131
Tony Barbour1fa09702017-03-16 12:09:08 -06001132 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1134
1135 std::vector<const char *> device_extension_names;
1136 auto features = m_device->phy().features();
1137 // Artificially disable support for non-solid fill modes
Chris Forbes05054022017-05-17 16:29:06 -07001138 features.fillModeNonSolid = VK_FALSE;
Cortd889ff92016-07-27 09:51:27 -07001139 // The sacrificial device object
1140 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1141
1142 VkRenderpassObj render_pass(&test_device);
1143
1144 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1145 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1146 pipeline_layout_ci.setLayoutCount = 0;
1147 pipeline_layout_ci.pSetLayouts = NULL;
1148
1149 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001150 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001151 ASSERT_VK_SUCCESS(err);
1152
1153 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1154 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1155 rs_ci.pNext = nullptr;
1156 rs_ci.lineWidth = 1.0f;
Chris Forbes05054022017-05-17 16:29:06 -07001157 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Cortd889ff92016-07-27 09:51:27 -07001158
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001159 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1160 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001161
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001162 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1164 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001165 {
1166 VkPipelineObj pipe(&test_device);
1167 pipe.AddShader(&vs);
1168 pipe.AddShader(&fs);
1169 pipe.AddColorAttachment();
1170 // Introduce failure by setting unsupported polygon mode
1171 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1172 pipe.SetRasterization(&rs_ci);
1173 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1174 }
1175 m_errorMonitor->VerifyFound();
1176
1177 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1179 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001180 {
1181 VkPipelineObj pipe(&test_device);
1182 pipe.AddShader(&vs);
1183 pipe.AddShader(&fs);
1184 pipe.AddColorAttachment();
1185 // Introduce failure by setting unsupported polygon mode
1186 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1187 pipe.SetRasterization(&rs_ci);
1188 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1189 }
1190 m_errorMonitor->VerifyFound();
1191
Cortd889ff92016-07-27 09:51:27 -07001192 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1193}
1194
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001195#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001196TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001197{
1198 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001199 VkFenceCreateInfo fenceInfo = {};
1200 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1201 fenceInfo.pNext = NULL;
1202 fenceInfo.flags = 0;
1203
Mike Weiblencce7ec72016-10-17 19:33:05 -06001204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001205
Tony Barbour1fa09702017-03-16 12:09:08 -06001206 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001207
1208 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1209 vk_testing::Buffer buffer;
1210 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001211
Tony Barbourfe3351b2015-07-28 10:17:20 -06001212 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001213 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001214 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001215
1216 testFence.init(*m_device, fenceInfo);
1217
1218 // Bypass framework since it does the waits automatically
1219 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001220 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001221 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1222 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001223 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001224 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001225 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001226 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001227 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001228 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001229 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001230
1231 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001232 ASSERT_VK_SUCCESS( err );
1233
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001234 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001235 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001236
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001237 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001238}
1239
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001240TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001241{
1242 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001243 VkFenceCreateInfo fenceInfo = {};
1244 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1245 fenceInfo.pNext = NULL;
1246 fenceInfo.flags = 0;
1247
Mike Weiblencce7ec72016-10-17 19:33:05 -06001248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001249
Tony Barbour1fa09702017-03-16 12:09:08 -06001250 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251 ASSERT_NO_FATAL_FAILURE(InitViewport());
1252 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1253
Tony Barbourfe3351b2015-07-28 10:17:20 -06001254 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001255 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001256 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001257
1258 testFence.init(*m_device, fenceInfo);
1259
1260 // Bypass framework since it does the waits automatically
1261 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001262 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001263 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1264 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001265 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001266 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001267 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001268 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001269 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001270 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001271 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001272
1273 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001274 ASSERT_VK_SUCCESS( err );
1275
Jon Ashburnf19916e2016-01-11 13:12:43 -07001276 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001277 VkCommandBufferBeginInfo info = {};
1278 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1279 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001280 info.renderPass = VK_NULL_HANDLE;
1281 info.subpass = 0;
1282 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001283 info.occlusionQueryEnable = VK_FALSE;
1284 info.queryFlags = 0;
1285 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001286
1287 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001288 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001289
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001290 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001291}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001292#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001293
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001294TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1295 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1296
Tony Barbour1fa09702017-03-16 12:09:08 -06001297 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001298
1299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1300 VkBuffer buffer;
1301 VkBufferCreateInfo buf_info = {};
1302 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1303 buf_info.pNext = NULL;
1304 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1305 buf_info.size = 2048;
1306 buf_info.queueFamilyIndexCount = 0;
1307 buf_info.pQueueFamilyIndices = NULL;
1308 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1309 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1310 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1311 m_errorMonitor->VerifyFound();
1312
1313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1314 VkImage image;
1315 VkImageCreateInfo image_create_info = {};
1316 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1317 image_create_info.pNext = NULL;
1318 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1319 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1320 image_create_info.extent.width = 512;
1321 image_create_info.extent.height = 64;
1322 image_create_info.extent.depth = 1;
1323 image_create_info.mipLevels = 1;
1324 image_create_info.arrayLayers = 1;
1325 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1326 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1327 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1328 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1329 image_create_info.queueFamilyIndexCount = 0;
1330 image_create_info.pQueueFamilyIndices = NULL;
1331 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1332 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1333 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1334 m_errorMonitor->VerifyFound();
1335}
1336
Dave Houlton829c0d82017-01-24 15:09:17 -07001337TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1338 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1339
1340 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001341 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001342 ASSERT_NO_FATAL_FAILURE(
1343 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001344 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001345
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001346 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001347 device_features.sparseResidencyImage2D = VK_FALSE;
1348 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001349 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001350
1351 VkImage image = VK_NULL_HANDLE;
1352 VkResult result = VK_RESULT_MAX_ENUM;
1353 VkImageCreateInfo image_create_info = {};
1354 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1355 image_create_info.pNext = NULL;
1356 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1357 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1358 image_create_info.extent.width = 512;
1359 image_create_info.extent.height = 1;
1360 image_create_info.extent.depth = 1;
1361 image_create_info.mipLevels = 1;
1362 image_create_info.arrayLayers = 1;
1363 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1364 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1365 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1366 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1367 image_create_info.queueFamilyIndexCount = 0;
1368 image_create_info.pQueueFamilyIndices = NULL;
1369 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1370 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1371
1372 // 1D image w/ sparse residency is an error
1373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1374 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1375 m_errorMonitor->VerifyFound();
1376 if (VK_SUCCESS == result) {
1377 vkDestroyImage(m_device->device(), image, NULL);
1378 image = VK_NULL_HANDLE;
1379 }
1380
1381 // 2D image w/ sparse residency when feature isn't available
1382 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1383 image_create_info.extent.height = 64;
1384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1385 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1386 m_errorMonitor->VerifyFound();
1387 if (VK_SUCCESS == result) {
1388 vkDestroyImage(m_device->device(), image, NULL);
1389 image = VK_NULL_HANDLE;
1390 }
1391
1392 // 3D image w/ sparse residency when feature isn't available
1393 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1394 image_create_info.extent.depth = 8;
1395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1396 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1397 m_errorMonitor->VerifyFound();
1398 if (VK_SUCCESS == result) {
1399 vkDestroyImage(m_device->device(), image, NULL);
1400 image = VK_NULL_HANDLE;
1401 }
1402}
1403
1404TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1405 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1406
1407 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001408 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001409 ASSERT_NO_FATAL_FAILURE(
1410 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001411 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001412
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001413 // These tests require that the device support sparse residency for 2D images
1414 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1415 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001416 return;
1417 }
1418
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001419 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001420 device_features.sparseResidency2Samples = VK_FALSE;
1421 device_features.sparseResidency4Samples = VK_FALSE;
1422 device_features.sparseResidency8Samples = VK_FALSE;
1423 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001424 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001425
1426 VkImage image = VK_NULL_HANDLE;
1427 VkResult result = VK_RESULT_MAX_ENUM;
1428 VkImageCreateInfo image_create_info = {};
1429 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1430 image_create_info.pNext = NULL;
1431 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1432 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1433 image_create_info.extent.width = 64;
1434 image_create_info.extent.height = 64;
1435 image_create_info.extent.depth = 1;
1436 image_create_info.mipLevels = 1;
1437 image_create_info.arrayLayers = 1;
1438 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1439 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1440 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1441 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1442 image_create_info.queueFamilyIndexCount = 0;
1443 image_create_info.pQueueFamilyIndices = NULL;
1444 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1445 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1446
1447 // 2D image w/ sparse residency and linear tiling is an error
1448 m_errorMonitor->SetDesiredFailureMsg(
1449 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1450 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1451 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1452 m_errorMonitor->VerifyFound();
1453 if (VK_SUCCESS == result) {
1454 vkDestroyImage(m_device->device(), image, NULL);
1455 image = VK_NULL_HANDLE;
1456 }
1457 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1458
1459 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1460 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1462 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1463 m_errorMonitor->VerifyFound();
1464 if (VK_SUCCESS == result) {
1465 vkDestroyImage(m_device->device(), image, NULL);
1466 image = VK_NULL_HANDLE;
1467 }
1468
1469 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1471 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1472 m_errorMonitor->VerifyFound();
1473 if (VK_SUCCESS == result) {
1474 vkDestroyImage(m_device->device(), image, NULL);
1475 image = VK_NULL_HANDLE;
1476 }
1477
1478 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1480 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1481 m_errorMonitor->VerifyFound();
1482 if (VK_SUCCESS == result) {
1483 vkDestroyImage(m_device->device(), image, NULL);
1484 image = VK_NULL_HANDLE;
1485 }
1486
1487 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1489 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1490 m_errorMonitor->VerifyFound();
1491 if (VK_SUCCESS == result) {
1492 vkDestroyImage(m_device->device(), image, NULL);
1493 image = VK_NULL_HANDLE;
1494 }
1495}
1496
Tobin Ehlisf11be982016-05-11 13:52:53 -06001497TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001498 TEST_DESCRIPTION(
1499 "Create a buffer and image, allocate memory, and bind the "
1500 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001501 VkResult err;
1502 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001503 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001504
Tobin Ehlis077ded32016-05-12 17:39:13 -06001505 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001506 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001507 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001508 VkDeviceMemory mem; // buffer will be bound first
1509 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001510 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001511 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001512
1513 VkBufferCreateInfo buf_info = {};
1514 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1515 buf_info.pNext = NULL;
1516 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1517 buf_info.size = 256;
1518 buf_info.queueFamilyIndexCount = 0;
1519 buf_info.pQueueFamilyIndices = NULL;
1520 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1521 buf_info.flags = 0;
1522 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1523 ASSERT_VK_SUCCESS(err);
1524
Tobin Ehlis077ded32016-05-12 17:39:13 -06001525 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001526
1527 VkImageCreateInfo image_create_info = {};
1528 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1529 image_create_info.pNext = NULL;
1530 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1531 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1532 image_create_info.extent.width = 64;
1533 image_create_info.extent.height = 64;
1534 image_create_info.extent.depth = 1;
1535 image_create_info.mipLevels = 1;
1536 image_create_info.arrayLayers = 1;
1537 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001538 // Image tiling must be optimal to trigger error when aliasing linear buffer
1539 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001540 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1541 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1542 image_create_info.queueFamilyIndexCount = 0;
1543 image_create_info.pQueueFamilyIndices = NULL;
1544 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1545 image_create_info.flags = 0;
1546
Tobin Ehlisf11be982016-05-11 13:52:53 -06001547 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1548 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001549 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1550 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001551
Tobin Ehlis077ded32016-05-12 17:39:13 -06001552 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1553
1554 VkMemoryAllocateInfo alloc_info = {};
1555 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1556 alloc_info.pNext = NULL;
1557 alloc_info.memoryTypeIndex = 0;
1558 // Ensure memory is big enough for both bindings
1559 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001560 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1561 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001562 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001563 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001564 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001565 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001566 return;
1567 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001568 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1569 ASSERT_VK_SUCCESS(err);
1570 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1571 ASSERT_VK_SUCCESS(err);
1572
Rene Lindsayd14f5572016-12-16 14:57:18 -07001573 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1574
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001576 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001577 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1578 m_errorMonitor->VerifyFound();
1579
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001580 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001581 // aliasing buffer2
1582 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1583 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001584 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1585 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001586 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001587 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001589 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001590 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001591 m_errorMonitor->VerifyFound();
1592
1593 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001596 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001597 vkFreeMemory(m_device->device(), mem, NULL);
1598 vkFreeMemory(m_device->device(), mem_img, NULL);
1599}
1600
Tobin Ehlis35372522016-05-12 08:32:31 -06001601TEST_F(VkLayerTest, InvalidMemoryMapping) {
1602 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1603 VkResult err;
1604 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001605 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001606
1607 VkBuffer buffer;
1608 VkDeviceMemory mem;
1609 VkMemoryRequirements mem_reqs;
1610
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001611 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1612
Tobin Ehlis35372522016-05-12 08:32:31 -06001613 VkBufferCreateInfo buf_info = {};
1614 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1615 buf_info.pNext = NULL;
1616 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1617 buf_info.size = 256;
1618 buf_info.queueFamilyIndexCount = 0;
1619 buf_info.pQueueFamilyIndices = NULL;
1620 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1621 buf_info.flags = 0;
1622 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1623 ASSERT_VK_SUCCESS(err);
1624
1625 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1626 VkMemoryAllocateInfo alloc_info = {};
1627 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1628 alloc_info.pNext = NULL;
1629 alloc_info.memoryTypeIndex = 0;
1630
1631 // Ensure memory is big enough for both bindings
1632 static const VkDeviceSize allocation_size = 0x10000;
1633 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001634 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001635 if (!pass) {
1636 vkDestroyBuffer(m_device->device(), buffer, NULL);
1637 return;
1638 }
1639 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1640 ASSERT_VK_SUCCESS(err);
1641
1642 uint8_t *pData;
1643 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001645 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1646 m_errorMonitor->VerifyFound();
1647 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001648 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001649 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1651 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1652 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001653 m_errorMonitor->VerifyFound();
1654
1655 // Unmap the memory to avoid re-map error
1656 vkUnmapMemory(m_device->device(), mem);
1657 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1659 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1660 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001661 m_errorMonitor->VerifyFound();
1662 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1664 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001665 m_errorMonitor->VerifyFound();
1666 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001668 vkUnmapMemory(m_device->device(), mem);
1669 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001670
Tobin Ehlis35372522016-05-12 08:32:31 -06001671 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001672 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001673 ASSERT_VK_SUCCESS(err);
1674 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001675 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001676 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001677 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001679 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1680 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001681
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 // Now flush range that oversteps mapped range
1683 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001684 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001685 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001686 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001687 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1689 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1690 m_errorMonitor->VerifyFound();
1691
1692 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1693 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001694 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001695 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001696 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001697 mmr.size = VK_WHOLE_SIZE;
1698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001699 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1700 m_errorMonitor->VerifyFound();
1701
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001702#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001703 // Some platforms have an atomsize of 1 which makes the test meaningless
1704 if (atom_size > 3) {
1705 // Now with an offset NOT a multiple of the device limit
1706 vkUnmapMemory(m_device->device(), mem);
1707 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1708 ASSERT_VK_SUCCESS(err);
1709 mmr.offset = 3; // Not a multiple of atom_size
1710 mmr.size = VK_WHOLE_SIZE;
1711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1712 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1713 m_errorMonitor->VerifyFound();
1714
1715 // Now with a size NOT a multiple of the device limit
1716 vkUnmapMemory(m_device->device(), mem);
1717 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1718 ASSERT_VK_SUCCESS(err);
1719 mmr.offset = atom_size;
1720 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1722 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1723 m_errorMonitor->VerifyFound();
1724 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001725#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001726 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1727 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001728 if (!pass) {
1729 vkFreeMemory(m_device->device(), mem, NULL);
1730 vkDestroyBuffer(m_device->device(), buffer, NULL);
1731 return;
1732 }
1733 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1734 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1735
1736 vkDestroyBuffer(m_device->device(), buffer, NULL);
1737 vkFreeMemory(m_device->device(), mem, NULL);
1738}
1739
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001740#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001741TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1742 VkResult err;
1743 bool pass;
1744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001745 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1746 // following declaration (which is temporarily being moved below):
1747 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001748 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001749 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001750 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001751 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001752 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001753 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001754
Tony Barbour1fa09702017-03-16 12:09:08 -06001755 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001756
Ian Elliott3f06ce52016-04-29 14:46:21 -06001757#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1758#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1759 // Use the functions from the VK_KHR_android_surface extension without
1760 // enabling that extension:
1761
1762 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001763 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1765 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001766 pass = (err != VK_SUCCESS);
1767 ASSERT_TRUE(pass);
1768 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001769#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001770
Ian Elliott3f06ce52016-04-29 14:46:21 -06001771#if defined(VK_USE_PLATFORM_MIR_KHR)
1772 // Use the functions from the VK_KHR_mir_surface extension without enabling
1773 // that extension:
1774
1775 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001776 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001778 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1779 pass = (err != VK_SUCCESS);
1780 ASSERT_TRUE(pass);
1781 m_errorMonitor->VerifyFound();
1782
1783 // Tell whether an mir_connection supports presentation:
1784 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1786 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001787 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001788#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001789
Ian Elliott3f06ce52016-04-29 14:46:21 -06001790#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1791 // Use the functions from the VK_KHR_wayland_surface extension without
1792 // enabling that extension:
1793
1794 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001795 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1797 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001798 pass = (err != VK_SUCCESS);
1799 ASSERT_TRUE(pass);
1800 m_errorMonitor->VerifyFound();
1801
1802 // Tell whether an wayland_display supports presentation:
1803 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1805 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001806 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001807#endif // VK_USE_PLATFORM_WAYLAND_KHR
1808#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001809
Ian Elliott3f06ce52016-04-29 14:46:21 -06001810#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001811 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1812 // TO NON-LINUX PLATFORMS:
1813 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001814 // Use the functions from the VK_KHR_win32_surface extension without
1815 // enabling that extension:
1816
1817 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001818 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1820 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001821 pass = (err != VK_SUCCESS);
1822 ASSERT_TRUE(pass);
1823 m_errorMonitor->VerifyFound();
1824
1825 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001827 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001828 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001829// Set this (for now, until all platforms are supported and tested):
1830#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001831#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001832#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001833 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1834 // TO NON-LINUX PLATFORMS:
1835 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001836#endif
1837#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001838 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1839 // that extension:
1840
1841 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001842 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001844 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1845 pass = (err != VK_SUCCESS);
1846 ASSERT_TRUE(pass);
1847 m_errorMonitor->VerifyFound();
1848
1849 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001850 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001851 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1853 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001854 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001855// Set this (for now, until all platforms are supported and tested):
1856#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001857#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001858
Ian Elliott12630812016-04-29 14:35:43 -06001859#if defined(VK_USE_PLATFORM_XLIB_KHR)
1860 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1861 // that extension:
1862
1863 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001864 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001866 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1867 pass = (err != VK_SUCCESS);
1868 ASSERT_TRUE(pass);
1869 m_errorMonitor->VerifyFound();
1870
1871 // Tell whether an Xlib VisualID supports presentation:
1872 Display *dpy = NULL;
1873 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001875 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1876 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001877// Set this (for now, until all platforms are supported and tested):
1878#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001879#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001880
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001881// Use the functions from the VK_KHR_surface extension without enabling
1882// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001883
Ian Elliott489eec02016-05-05 14:12:44 -06001884#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001885 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001887 vkDestroySurfaceKHR(instance(), surface, NULL);
1888 m_errorMonitor->VerifyFound();
1889
1890 // Check if surface supports presentation:
1891 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001893 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1894 pass = (err != VK_SUCCESS);
1895 ASSERT_TRUE(pass);
1896 m_errorMonitor->VerifyFound();
1897
1898 // Check surface capabilities:
1899 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1901 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001902 pass = (err != VK_SUCCESS);
1903 ASSERT_TRUE(pass);
1904 m_errorMonitor->VerifyFound();
1905
1906 // Check surface formats:
1907 uint32_t format_count = 0;
1908 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1910 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001911 pass = (err != VK_SUCCESS);
1912 ASSERT_TRUE(pass);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check surface present modes:
1916 uint32_t present_mode_count = 0;
1917 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1919 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001920 pass = (err != VK_SUCCESS);
1921 ASSERT_TRUE(pass);
1922 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001923#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001924
Ian Elliott1c32c772016-04-28 14:47:13 -06001925 // Use the functions from the VK_KHR_swapchain extension without enabling
1926 // that extension:
1927
1928 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001930 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1931 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001932 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001933 pass = (err != VK_SUCCESS);
1934 ASSERT_TRUE(pass);
1935 m_errorMonitor->VerifyFound();
1936
1937 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1939 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001940 pass = (err != VK_SUCCESS);
1941 ASSERT_TRUE(pass);
1942 m_errorMonitor->VerifyFound();
1943
Chris Forbeseb7d5502016-09-13 18:19:21 +12001944 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1945 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1946 VkFence fence;
1947 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1948
Ian Elliott1c32c772016-04-28 14:47:13 -06001949 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001951 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001952 pass = (err != VK_SUCCESS);
1953 ASSERT_TRUE(pass);
1954 m_errorMonitor->VerifyFound();
1955
Chris Forbeseb7d5502016-09-13 18:19:21 +12001956 vkDestroyFence(m_device->device(), fence, nullptr);
1957
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001959 //
1960 // NOTE: Currently can't test this because a real swapchain is needed (as
1961 // opposed to the fake one we created) in order for the layer to lookup the
1962 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001963
1964 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001966 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1967 m_errorMonitor->VerifyFound();
1968}
Chris Forbes09368e42016-10-13 11:59:22 +13001969#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001970
Karl Schultz6addd812016-02-02 17:17:23 -07001971TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1972 VkResult err;
1973 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001974
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1976 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001977
Tony Barbour1fa09702017-03-16 12:09:08 -06001978 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001979
1980 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001981 VkImage image;
1982 VkDeviceMemory mem;
1983 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001984
Karl Schultz6addd812016-02-02 17:17:23 -07001985 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1986 const int32_t tex_width = 32;
1987 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001988
Tony Barboureb254902015-07-15 12:50:33 -06001989 VkImageCreateInfo image_create_info = {};
1990 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001991 image_create_info.pNext = NULL;
1992 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1993 image_create_info.format = tex_format;
1994 image_create_info.extent.width = tex_width;
1995 image_create_info.extent.height = tex_height;
1996 image_create_info.extent.depth = 1;
1997 image_create_info.mipLevels = 1;
1998 image_create_info.arrayLayers = 1;
1999 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2000 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2001 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2002 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002003 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002004
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002005 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002006 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002007 mem_alloc.pNext = NULL;
2008 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002009
Chia-I Wuf7458c52015-10-26 21:10:41 +08002010 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002011 ASSERT_VK_SUCCESS(err);
2012
Karl Schultz6addd812016-02-02 17:17:23 -07002013 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002014
Mark Lobodzinski23065352015-05-29 09:32:35 -05002015 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002016
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002017 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002018 if (!pass) { // If we can't find any unmappable memory this test doesn't
2019 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002020 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002021 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002022 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002023
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002024 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002025 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002026 ASSERT_VK_SUCCESS(err);
2027
2028 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002029 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002030 ASSERT_VK_SUCCESS(err);
2031
2032 // Map memory as if to initialize the image
2033 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002034 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002036 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002037
Chia-I Wuf7458c52015-10-26 21:10:41 +08002038 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002039 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040}
2041
Karl Schultz6addd812016-02-02 17:17:23 -07002042TEST_F(VkLayerTest, RebindMemory) {
2043 VkResult err;
2044 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002045
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002047
Tony Barbour1fa09702017-03-16 12:09:08 -06002048 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002049
2050 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002051 VkImage image;
2052 VkDeviceMemory mem1;
2053 VkDeviceMemory mem2;
2054 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002055
Karl Schultz6addd812016-02-02 17:17:23 -07002056 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2057 const int32_t tex_width = 32;
2058 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002059
Tony Barboureb254902015-07-15 12:50:33 -06002060 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002061 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2062 image_create_info.pNext = NULL;
2063 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2064 image_create_info.format = tex_format;
2065 image_create_info.extent.width = tex_width;
2066 image_create_info.extent.height = tex_height;
2067 image_create_info.extent.depth = 1;
2068 image_create_info.mipLevels = 1;
2069 image_create_info.arrayLayers = 1;
2070 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2071 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2072 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2073 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002074
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002075 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002076 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2077 mem_alloc.pNext = NULL;
2078 mem_alloc.allocationSize = 0;
2079 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002080
Karl Schultz6addd812016-02-02 17:17:23 -07002081 // Introduce failure, do NOT set memProps to
2082 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002083 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002084 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002085 ASSERT_VK_SUCCESS(err);
2086
Karl Schultz6addd812016-02-02 17:17:23 -07002087 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002088
2089 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002090 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002091 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002092
2093 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002094 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002095 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002096 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002097 ASSERT_VK_SUCCESS(err);
2098
2099 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002100 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101 ASSERT_VK_SUCCESS(err);
2102
Karl Schultz6addd812016-02-02 17:17:23 -07002103 // Introduce validation failure, try to bind a different memory object to
2104 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002105 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002106
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002107 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002108
Chia-I Wuf7458c52015-10-26 21:10:41 +08002109 vkDestroyImage(m_device->device(), image, NULL);
2110 vkFreeMemory(m_device->device(), mem1, NULL);
2111 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002112}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002113
Karl Schultz6addd812016-02-02 17:17:23 -07002114TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002115 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002116
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2118 "submitted in SIGNALED state. Fences "
2119 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002120
2121 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002122 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2123 fenceInfo.pNext = NULL;
2124 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002125
Tony Barbour1fa09702017-03-16 12:09:08 -06002126 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002127 ASSERT_NO_FATAL_FAILURE(InitViewport());
2128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2129
Tony Barbour552f6c02016-12-21 14:34:07 -07002130 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002131 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002132 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002133
2134 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002135
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002136 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002137 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2138 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002139 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002140 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002141 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002142 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002143 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002144 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002145 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002146
2147 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002148 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002149
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002150 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002151}
Chris Forbes4e44c912016-06-16 10:20:00 +12002152
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002153TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002154 TEST_DESCRIPTION(
2155 "Specify wrong usage for image then create conflicting view of image "
2156 "Initialize buffer with wrong usage then perform copy expecting errors "
2157 "from both the image and the buffer (2 calls)");
Mark Lobodzinski33826372017-04-13 11:10:11 -06002158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for Image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002159
Tony Barbour1fa09702017-03-16 12:09:08 -06002160 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002161 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002162 if (!format) {
2163 printf(" No Depth + Stencil format found. Skipped.\n");
2164 return;
2165 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002166
Tony Barbourf92621a2016-05-02 14:28:12 -06002167 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002168 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002169 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002170 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002171
Tony Barbourf92621a2016-05-02 14:28:12 -06002172 VkImageView dsv;
2173 VkImageViewCreateInfo dsvci = {};
2174 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2175 dsvci.image = image.handle();
2176 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002177 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002178 dsvci.subresourceRange.layerCount = 1;
2179 dsvci.subresourceRange.baseMipLevel = 0;
2180 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002181 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002182
Tony Barbourf92621a2016-05-02 14:28:12 -06002183 // Create a view with depth / stencil aspect for image with different usage
2184 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002186 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002187
2188 // Initialize buffer with TRANSFER_DST usage
2189 vk_testing::Buffer buffer;
2190 VkMemoryPropertyFlags reqs = 0;
2191 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2192 VkBufferImageCopy region = {};
2193 region.bufferRowLength = 128;
2194 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002195 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002196 region.imageSubresource.layerCount = 1;
2197 region.imageExtent.height = 16;
2198 region.imageExtent.width = 16;
2199 region.imageExtent.depth = 1;
2200
Mark Lobodzinski80871462017-02-16 10:37:27 -07002201 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002202 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002203
Chris Forbesda581202016-10-06 18:25:26 +13002204 // two separate errors from this call:
Mark Lobodzinski33826372017-04-13 11:10:11 -06002205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Chris Forbesda581202016-10-06 18:25:26 +13002207
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002208 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2209 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002210 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002211}
Tony Barbour75d79f02016-08-30 09:39:07 -06002212
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002213TEST_F(VkLayerTest, LeakAnObject) {
2214 VkResult err;
2215
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002216 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002217
2218 // Note that we have to create a new device since destroying the
2219 // framework's device causes Teardown() to fail and just calling Teardown
2220 // will destroy the errorMonitor.
2221
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002223
Tony Barbour1fa09702017-03-16 12:09:08 -06002224 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002226 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002227 std::vector<VkDeviceQueueCreateInfo> queue_info;
2228 queue_info.reserve(queue_props.size());
2229 std::vector<std::vector<float>> queue_priorities;
2230 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2231 VkDeviceQueueCreateInfo qi = {};
2232 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2233 qi.pNext = NULL;
2234 qi.queueFamilyIndex = i;
2235 qi.queueCount = queue_props[i].queueCount;
2236 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2237 qi.pQueuePriorities = queue_priorities[i].data();
2238 queue_info.push_back(qi);
2239 }
2240
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002241 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002242
2243 // The sacrificial device object
2244 VkDevice testDevice;
2245 VkDeviceCreateInfo device_create_info = {};
2246 auto features = m_device->phy().features();
2247 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2248 device_create_info.pNext = NULL;
2249 device_create_info.queueCreateInfoCount = queue_info.size();
2250 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002251 device_create_info.enabledLayerCount = 0;
2252 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002253 device_create_info.pEnabledFeatures = &features;
2254 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2255 ASSERT_VK_SUCCESS(err);
2256
2257 VkFence fence;
2258 VkFenceCreateInfo fence_create_info = {};
2259 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2260 fence_create_info.pNext = NULL;
2261 fence_create_info.flags = 0;
2262 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2263 ASSERT_VK_SUCCESS(err);
2264
2265 // Induce failure by not calling vkDestroyFence
2266 vkDestroyDevice(testDevice, NULL);
2267 m_errorMonitor->VerifyFound();
2268}
2269
2270TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002271 TEST_DESCRIPTION(
2272 "Allocate command buffers from one command pool and "
2273 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002274
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002276
Tony Barbour1fa09702017-03-16 12:09:08 -06002277 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002278 VkCommandPool command_pool_one;
2279 VkCommandPool command_pool_two;
2280
2281 VkCommandPoolCreateInfo pool_create_info{};
2282 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2283 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2284 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2285
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002286 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002288 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002289
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002290 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002291 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002292 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002293 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002294 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002295 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002296 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002297
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002298 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
2300 m_errorMonitor->VerifyFound();
2301
2302 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2303 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2304}
2305
2306TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2307 VkResult err;
2308
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002309 TEST_DESCRIPTION(
2310 "Allocate descriptor sets from one DS pool and "
2311 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002312
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002314
Tony Barbour1fa09702017-03-16 12:09:08 -06002315 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002316 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2317
2318 VkDescriptorPoolSize ds_type_count = {};
2319 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2320 ds_type_count.descriptorCount = 1;
2321
2322 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2323 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2324 ds_pool_ci.pNext = NULL;
2325 ds_pool_ci.flags = 0;
2326 ds_pool_ci.maxSets = 1;
2327 ds_pool_ci.poolSizeCount = 1;
2328 ds_pool_ci.pPoolSizes = &ds_type_count;
2329
2330 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002331 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002332 ASSERT_VK_SUCCESS(err);
2333
2334 // Create a second descriptor pool
2335 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002336 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002337 ASSERT_VK_SUCCESS(err);
2338
2339 VkDescriptorSetLayoutBinding dsl_binding = {};
2340 dsl_binding.binding = 0;
2341 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2342 dsl_binding.descriptorCount = 1;
2343 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2344 dsl_binding.pImmutableSamplers = NULL;
2345
2346 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2347 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2348 ds_layout_ci.pNext = NULL;
2349 ds_layout_ci.bindingCount = 1;
2350 ds_layout_ci.pBindings = &dsl_binding;
2351
2352 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002353 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002354 ASSERT_VK_SUCCESS(err);
2355
2356 VkDescriptorSet descriptorSet;
2357 VkDescriptorSetAllocateInfo alloc_info = {};
2358 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2359 alloc_info.descriptorSetCount = 1;
2360 alloc_info.descriptorPool = ds_pool_one;
2361 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002363 ASSERT_VK_SUCCESS(err);
2364
2365 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2366
2367 m_errorMonitor->VerifyFound();
2368
2369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2370 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2371 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2372}
2373
2374TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002376
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002377 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002378
Tony Barbour1fa09702017-03-16 12:09:08 -06002379 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002380
2381 // Pass bogus handle into GetImageMemoryRequirements
2382 VkMemoryRequirements mem_reqs;
2383 uint64_t fakeImageHandle = 0xCADECADE;
2384 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2385
2386 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2387
2388 m_errorMonitor->VerifyFound();
2389}
2390
Mike Schuchardt17838902017-02-21 09:48:06 -07002391TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2392 TEST_DESCRIPTION(
2393 "Try to destroy a render pass object using a device other than the one it was created on. "
2394 "This should generate a distinct error from the invalid handle error.");
2395 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002396 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2398
2399 // Create second device
2400 float priorities[] = {1.0f};
2401 VkDeviceQueueCreateInfo queue_info{};
2402 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2403 queue_info.pNext = NULL;
2404 queue_info.flags = 0;
2405 queue_info.queueFamilyIndex = 0;
2406 queue_info.queueCount = 1;
2407 queue_info.pQueuePriorities = &priorities[0];
2408
2409 VkDeviceCreateInfo device_create_info = {};
2410 auto features = m_device->phy().features();
2411 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2412 device_create_info.pNext = NULL;
2413 device_create_info.queueCreateInfoCount = 1;
2414 device_create_info.pQueueCreateInfos = &queue_info;
2415 device_create_info.enabledLayerCount = 0;
2416 device_create_info.ppEnabledLayerNames = NULL;
2417 device_create_info.pEnabledFeatures = &features;
2418
2419 VkDevice second_device;
2420 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2421
2422 // Try to destroy the renderpass from the first device using the second device
2423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2424 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2425 m_errorMonitor->VerifyFound();
2426
2427 vkDestroyDevice(second_device, NULL);
2428}
2429
Karl Schultz6addd812016-02-02 17:17:23 -07002430TEST_F(VkLayerTest, PipelineNotBound) {
2431 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002432
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002433 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002434
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002436
Tony Barbour1fa09702017-03-16 12:09:08 -06002437 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002439
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002440 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002441 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2442 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002443
2444 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002445 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2446 ds_pool_ci.pNext = NULL;
2447 ds_pool_ci.maxSets = 1;
2448 ds_pool_ci.poolSizeCount = 1;
2449 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002450
2451 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002452 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002453 ASSERT_VK_SUCCESS(err);
2454
2455 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002456 dsl_binding.binding = 0;
2457 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2458 dsl_binding.descriptorCount = 1;
2459 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2460 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002461
2462 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002463 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2464 ds_layout_ci.pNext = NULL;
2465 ds_layout_ci.bindingCount = 1;
2466 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002467
2468 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002469 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002470 ASSERT_VK_SUCCESS(err);
2471
2472 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002473 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002474 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002475 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002476 alloc_info.descriptorPool = ds_pool;
2477 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002478 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002479 ASSERT_VK_SUCCESS(err);
2480
2481 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002482 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2483 pipeline_layout_ci.pNext = NULL;
2484 pipeline_layout_ci.setLayoutCount = 1;
2485 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002486
2487 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002488 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002489 ASSERT_VK_SUCCESS(err);
2490
Mark Youngad779052016-01-06 14:26:04 -07002491 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
Tony Barbour552f6c02016-12-21 14:34:07 -07002493 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002494 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002497
Chia-I Wuf7458c52015-10-26 21:10:41 +08002498 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2499 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2500 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002501}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002502
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002503TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2504 VkResult err;
2505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002506 TEST_DESCRIPTION(
2507 "Test validation check for an invalid memory type index "
2508 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002509
Tony Barbour1fa09702017-03-16 12:09:08 -06002510 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002511
2512 // Create an image, allocate memory, set a bad typeIndex and then try to
2513 // bind it
2514 VkImage image;
2515 VkDeviceMemory mem;
2516 VkMemoryRequirements mem_reqs;
2517 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2518 const int32_t tex_width = 32;
2519 const int32_t tex_height = 32;
2520
2521 VkImageCreateInfo image_create_info = {};
2522 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2523 image_create_info.pNext = NULL;
2524 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2525 image_create_info.format = tex_format;
2526 image_create_info.extent.width = tex_width;
2527 image_create_info.extent.height = tex_height;
2528 image_create_info.extent.depth = 1;
2529 image_create_info.mipLevels = 1;
2530 image_create_info.arrayLayers = 1;
2531 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2532 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2533 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2534 image_create_info.flags = 0;
2535
2536 VkMemoryAllocateInfo mem_alloc = {};
2537 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2538 mem_alloc.pNext = NULL;
2539 mem_alloc.allocationSize = 0;
2540 mem_alloc.memoryTypeIndex = 0;
2541
2542 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2543 ASSERT_VK_SUCCESS(err);
2544
2545 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2546 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002547
2548 // Introduce Failure, select invalid TypeIndex
2549 VkPhysicalDeviceMemoryProperties memory_info;
2550
2551 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2552 unsigned int i;
2553 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2554 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2555 mem_alloc.memoryTypeIndex = i;
2556 break;
2557 }
2558 }
2559 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002560 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002561 vkDestroyImage(m_device->device(), image, NULL);
2562 return;
2563 }
2564
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002566
2567 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2568 ASSERT_VK_SUCCESS(err);
2569
2570 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2571 (void)err;
2572
2573 m_errorMonitor->VerifyFound();
2574
2575 vkDestroyImage(m_device->device(), image, NULL);
2576 vkFreeMemory(m_device->device(), mem, NULL);
2577}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002578
Karl Schultz6addd812016-02-02 17:17:23 -07002579TEST_F(VkLayerTest, BindInvalidMemory) {
2580 VkResult err;
2581 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002582
Tony Barbour1fa09702017-03-16 12:09:08 -06002583 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002584
Cortf801b982017-01-17 18:10:21 -08002585 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002586 const int32_t tex_width = 256;
2587 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002588
2589 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002590 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2591 image_create_info.pNext = NULL;
2592 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2593 image_create_info.format = tex_format;
2594 image_create_info.extent.width = tex_width;
2595 image_create_info.extent.height = tex_height;
2596 image_create_info.extent.depth = 1;
2597 image_create_info.mipLevels = 1;
2598 image_create_info.arrayLayers = 1;
2599 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002600 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002601 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2602 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002603
Cortf801b982017-01-17 18:10:21 -08002604 VkBufferCreateInfo buffer_create_info = {};
2605 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2606 buffer_create_info.pNext = NULL;
2607 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002608 buffer_create_info.size = 4 * 1024 * 1024;
2609 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002610 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002611
Cortf801b982017-01-17 18:10:21 -08002612 // Create an image/buffer, allocate memory, free it, and then try to bind it
2613 {
2614 VkImage image = VK_NULL_HANDLE;
2615 VkBuffer buffer = VK_NULL_HANDLE;
2616 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2617 ASSERT_VK_SUCCESS(err);
2618 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2619 ASSERT_VK_SUCCESS(err);
2620 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2621 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2622 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002623
Cortf801b982017-01-17 18:10:21 -08002624 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2625 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2626 image_mem_alloc.allocationSize = image_mem_reqs.size;
2627 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2628 ASSERT_TRUE(pass);
2629 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2630 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2631 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2632 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002633
Cortf801b982017-01-17 18:10:21 -08002634 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2635 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2636 ASSERT_VK_SUCCESS(err);
2637 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2638 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002639
Cortf801b982017-01-17 18:10:21 -08002640 vkFreeMemory(device(), image_mem, NULL);
2641 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002642
Cortf801b982017-01-17 18:10:21 -08002643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2644 err = vkBindImageMemory(device(), image, image_mem, 0);
2645 (void)err; // This may very well return an error.
2646 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002647
Cortf801b982017-01-17 18:10:21 -08002648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2649 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2650 (void)err; // This may very well return an error.
2651 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002652
Cortf801b982017-01-17 18:10:21 -08002653 vkDestroyImage(m_device->device(), image, NULL);
2654 vkDestroyBuffer(m_device->device(), buffer, NULL);
2655 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002656
2657 // Try to bind memory to an object that already has a memory binding
2658 {
2659 VkImage image = VK_NULL_HANDLE;
2660 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2661 ASSERT_VK_SUCCESS(err);
2662 VkBuffer buffer = VK_NULL_HANDLE;
2663 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2664 ASSERT_VK_SUCCESS(err);
2665 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2666 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2667 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2668 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2669 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2670 image_alloc_info.allocationSize = image_mem_reqs.size;
2671 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2672 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2673 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2674 ASSERT_TRUE(pass);
2675 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2676 ASSERT_TRUE(pass);
2677 VkDeviceMemory image_mem, buffer_mem;
2678 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2679 ASSERT_VK_SUCCESS(err);
2680 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2681 ASSERT_VK_SUCCESS(err);
2682
2683 err = vkBindImageMemory(device(), image, image_mem, 0);
2684 ASSERT_VK_SUCCESS(err);
2685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2686 err = vkBindImageMemory(device(), image, image_mem, 0);
2687 (void)err; // This may very well return an error.
2688 m_errorMonitor->VerifyFound();
2689
2690 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2691 ASSERT_VK_SUCCESS(err);
2692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2693 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2694 (void)err; // This may very well return an error.
2695 m_errorMonitor->VerifyFound();
2696
2697 vkFreeMemory(device(), image_mem, NULL);
2698 vkFreeMemory(device(), buffer_mem, NULL);
2699 vkDestroyImage(device(), image, NULL);
2700 vkDestroyBuffer(device(), buffer, NULL);
2701 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002702
Cort Strattonde748202017-02-17 12:50:01 -08002703 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002704 {
2705 VkImage image = VK_NULL_HANDLE;
2706 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2707 ASSERT_VK_SUCCESS(err);
2708 VkBuffer buffer = VK_NULL_HANDLE;
2709 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2710 ASSERT_VK_SUCCESS(err);
2711 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2712 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2713 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2714 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2715 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002716 // Leave some extra space for alignment wiggle room
2717 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002718 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002719 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002720 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2721 ASSERT_TRUE(pass);
2722 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2723 ASSERT_TRUE(pass);
2724 VkDeviceMemory image_mem, buffer_mem;
2725 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2726 ASSERT_VK_SUCCESS(err);
2727 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2728 ASSERT_VK_SUCCESS(err);
2729
Cort Strattonde748202017-02-17 12:50:01 -08002730 // Test unaligned memory offset
2731 {
2732 if (image_mem_reqs.alignment > 1) {
2733 VkDeviceSize image_offset = 1;
2734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2735 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2736 (void)err; // This may very well return an error.
2737 m_errorMonitor->VerifyFound();
2738 }
Cort6c7dff72017-01-27 18:34:50 -08002739
Cort Strattonde748202017-02-17 12:50:01 -08002740 if (buffer_mem_reqs.alignment > 1) {
2741 VkDeviceSize buffer_offset = 1;
2742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2743 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2744 (void)err; // This may very well return an error.
2745 m_errorMonitor->VerifyFound();
2746 }
2747 }
2748
2749 // Test memory offsets outside the memory allocation
2750 {
2751 VkDeviceSize image_offset =
2752 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2754 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2755 (void)err; // This may very well return an error.
2756 m_errorMonitor->VerifyFound();
2757
2758 VkDeviceSize buffer_offset =
2759 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2761 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2762 (void)err; // This may very well return an error.
2763 m_errorMonitor->VerifyFound();
2764 }
2765
2766 // Test memory offsets within the memory allocation, but which leave too little memory for
2767 // the resource.
2768 {
2769 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002770 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2772 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2773 (void)err; // This may very well return an error.
2774 m_errorMonitor->VerifyFound();
2775 }
2776
2777 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2778 if (buffer_offset > 0) {
2779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2780 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2781 (void)err; // This may very well return an error.
2782 m_errorMonitor->VerifyFound();
2783 }
2784 }
Cort6c7dff72017-01-27 18:34:50 -08002785
2786 vkFreeMemory(device(), image_mem, NULL);
2787 vkFreeMemory(device(), buffer_mem, NULL);
2788 vkDestroyImage(device(), image, NULL);
2789 vkDestroyBuffer(device(), buffer, NULL);
2790 }
2791
Cort Stratton4c38bb52017-01-28 13:33:10 -08002792 // Try to bind memory to an object with an invalid memory type
2793 {
2794 VkImage image = VK_NULL_HANDLE;
2795 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2796 ASSERT_VK_SUCCESS(err);
2797 VkBuffer buffer = VK_NULL_HANDLE;
2798 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2799 ASSERT_VK_SUCCESS(err);
2800 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2801 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2802 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2803 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2804 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2805 image_alloc_info.allocationSize = image_mem_reqs.size;
2806 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2807 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002808 // Create a mask of available memory types *not* supported by these resources,
2809 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002810 VkPhysicalDeviceMemoryProperties memory_properties = {};
2811 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002812 VkDeviceMemory image_mem, buffer_mem;
2813
Cort Stratton4c38bb52017-01-28 13:33:10 -08002814 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002815 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002816 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2817 ASSERT_TRUE(pass);
2818 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2819 ASSERT_VK_SUCCESS(err);
2820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2821 err = vkBindImageMemory(device(), image, image_mem, 0);
2822 (void)err; // This may very well return an error.
2823 m_errorMonitor->VerifyFound();
2824 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002825 }
2826
Cort Stratton4c38bb52017-01-28 13:33:10 -08002827 uint32_t buffer_unsupported_mem_type_bits =
2828 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002829 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002830 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2831 ASSERT_TRUE(pass);
2832 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2833 ASSERT_VK_SUCCESS(err);
2834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2835 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2836 (void)err; // This may very well return an error.
2837 m_errorMonitor->VerifyFound();
2838 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002840
Cort Stratton4c38bb52017-01-28 13:33:10 -08002841 vkDestroyImage(device(), image, NULL);
2842 vkDestroyBuffer(device(), buffer, NULL);
2843 }
2844
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002845 // Try to bind memory to an image created with sparse memory flags
2846 {
2847 VkImageCreateInfo sparse_image_create_info = image_create_info;
2848 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2849 VkImageFormatProperties image_format_properties = {};
2850 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2851 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2852 sparse_image_create_info.usage, sparse_image_create_info.flags,
2853 &image_format_properties);
2854 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2855 // most likely means sparse formats aren't supported here; skip this test.
2856 } else {
2857 ASSERT_VK_SUCCESS(err);
2858 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002859 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002860 return;
2861 } else {
2862 VkImage sparse_image = VK_NULL_HANDLE;
2863 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2864 ASSERT_VK_SUCCESS(err);
2865 VkMemoryRequirements sparse_mem_reqs = {};
2866 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2867 if (sparse_mem_reqs.memoryTypeBits != 0) {
2868 VkMemoryAllocateInfo sparse_mem_alloc = {};
2869 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2870 sparse_mem_alloc.pNext = NULL;
2871 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2872 sparse_mem_alloc.memoryTypeIndex = 0;
2873 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2874 ASSERT_TRUE(pass);
2875 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2876 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2877 ASSERT_VK_SUCCESS(err);
2878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2879 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2880 // This may very well return an error.
2881 (void)err;
2882 m_errorMonitor->VerifyFound();
2883 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2884 }
2885 vkDestroyImage(m_device->device(), sparse_image, NULL);
2886 }
2887 }
2888 }
2889
2890 // Try to bind memory to a buffer created with sparse memory flags
2891 {
2892 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2893 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2894 if (!m_device->phy().features().sparseResidencyBuffer) {
2895 // most likely means sparse formats aren't supported here; skip this test.
2896 } else {
2897 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2898 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2899 ASSERT_VK_SUCCESS(err);
2900 VkMemoryRequirements sparse_mem_reqs = {};
2901 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2902 if (sparse_mem_reqs.memoryTypeBits != 0) {
2903 VkMemoryAllocateInfo sparse_mem_alloc = {};
2904 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2905 sparse_mem_alloc.pNext = NULL;
2906 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2907 sparse_mem_alloc.memoryTypeIndex = 0;
2908 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2909 ASSERT_TRUE(pass);
2910 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2911 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2912 ASSERT_VK_SUCCESS(err);
2913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2914 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2915 // This may very well return an error.
2916 (void)err;
2917 m_errorMonitor->VerifyFound();
2918 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2919 }
2920 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2921 }
2922 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002923}
2924
Karl Schultz6addd812016-02-02 17:17:23 -07002925TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2926 VkResult err;
2927 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002928
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002930
Tony Barbour1fa09702017-03-16 12:09:08 -06002931 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002932
Karl Schultz6addd812016-02-02 17:17:23 -07002933 // Create an image object, allocate memory, destroy the object and then try
2934 // to bind it
2935 VkImage image;
2936 VkDeviceMemory mem;
2937 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002938
Karl Schultz6addd812016-02-02 17:17:23 -07002939 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2940 const int32_t tex_width = 32;
2941 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002942
2943 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002944 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2945 image_create_info.pNext = NULL;
2946 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2947 image_create_info.format = tex_format;
2948 image_create_info.extent.width = tex_width;
2949 image_create_info.extent.height = tex_height;
2950 image_create_info.extent.depth = 1;
2951 image_create_info.mipLevels = 1;
2952 image_create_info.arrayLayers = 1;
2953 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2954 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2955 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2956 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002957
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002958 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002959 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2960 mem_alloc.pNext = NULL;
2961 mem_alloc.allocationSize = 0;
2962 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Chia-I Wuf7458c52015-10-26 21:10:41 +08002964 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002965 ASSERT_VK_SUCCESS(err);
2966
Karl Schultz6addd812016-02-02 17:17:23 -07002967 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002968
2969 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002970 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002971 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002972
2973 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002974 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002975 ASSERT_VK_SUCCESS(err);
2976
2977 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002978 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002979 ASSERT_VK_SUCCESS(err);
2980
2981 // Now Try to bind memory to this destroyed object
2982 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2983 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002984 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002985
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002986 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002987
Chia-I Wuf7458c52015-10-26 21:10:41 +08002988 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002989}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002990
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002991TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2992 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2993
Tony Barbour1fa09702017-03-16 12:09:08 -06002994 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2996
2997 VkVertexInputBindingDescription input_binding;
2998 memset(&input_binding, 0, sizeof(input_binding));
2999
3000 VkVertexInputAttributeDescription input_attribs;
3001 memset(&input_attribs, 0, sizeof(input_attribs));
3002
3003 // Pick a really bad format for this purpose and make sure it should fail
3004 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3005 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3006 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003007 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003008 return;
3009 }
3010
3011 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003012 char const *vsSource =
3013 "#version 450\n"
3014 "\n"
3015 "out gl_PerVertex {\n"
3016 " vec4 gl_Position;\n"
3017 "};\n"
3018 "void main(){\n"
3019 " gl_Position = vec4(1);\n"
3020 "}\n";
3021 char const *fsSource =
3022 "#version 450\n"
3023 "\n"
3024 "layout(location=0) out vec4 color;\n"
3025 "void main(){\n"
3026 " color = vec4(1);\n"
3027 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003028
3029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3030 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3031 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3032
3033 VkPipelineObj pipe(m_device);
3034 pipe.AddColorAttachment();
3035 pipe.AddShader(&vs);
3036 pipe.AddShader(&fs);
3037
3038 pipe.AddVertexInputBindings(&input_binding, 1);
3039 pipe.AddVertexInputAttribs(&input_attribs, 1);
3040
3041 VkDescriptorSetObj descriptorSet(m_device);
3042 descriptorSet.AppendDummy();
3043 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3044
3045 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3046
3047 m_errorMonitor->VerifyFound();
3048}
3049
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003050TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003051 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003052 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003053
3054 VkMemoryPropertyFlags reqs = 0;
3055 VkImageCreateInfo image_create_info = {};
3056 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3057 image_create_info.pNext = NULL;
3058 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3059 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3060 image_create_info.extent.width = 256;
3061 image_create_info.extent.height = 256;
3062 image_create_info.extent.depth = 1;
3063 image_create_info.mipLevels = 1;
3064 image_create_info.arrayLayers = 1;
3065 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3066 image_create_info.flags = 0;
3067
3068 VkImageBlit blit_region = {};
3069 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3070 blit_region.srcSubresource.baseArrayLayer = 0;
3071 blit_region.srcSubresource.layerCount = 1;
3072 blit_region.srcSubresource.mipLevel = 0;
3073 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3074 blit_region.dstSubresource.baseArrayLayer = 0;
3075 blit_region.dstSubresource.layerCount = 1;
3076 blit_region.dstSubresource.mipLevel = 0;
3077
3078 // Create two images, the source with sampleCount = 2, and attempt to blit
3079 // between them
3080 {
3081 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003082 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003083 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003084 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003085 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003086 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003087 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003088 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003089 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003090 m_errorMonitor->SetDesiredFailureMsg(
3091 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3092 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003093 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3094 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003095 m_errorMonitor->VerifyFound();
3096 m_commandBuffer->EndCommandBuffer();
3097 }
3098
3099 // Create two images, the dest with sampleCount = 4, and attempt to blit
3100 // between them
3101 {
3102 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003103 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003104 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003105 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003106 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003107 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003108 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003109 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003110 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003111 m_errorMonitor->SetDesiredFailureMsg(
3112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3113 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003114 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3115 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 m_errorMonitor->VerifyFound();
3117 m_commandBuffer->EndCommandBuffer();
3118 }
3119
3120 VkBufferImageCopy copy_region = {};
3121 copy_region.bufferRowLength = 128;
3122 copy_region.bufferImageHeight = 128;
3123 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3124 copy_region.imageSubresource.layerCount = 1;
3125 copy_region.imageExtent.height = 64;
3126 copy_region.imageExtent.width = 64;
3127 copy_region.imageExtent.depth = 1;
3128
3129 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3130 // buffer to image
3131 {
3132 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003133 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3134 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003135 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003136 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003137 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003138 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003139 m_errorMonitor->SetDesiredFailureMsg(
3140 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3141 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003142 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3143 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003144 m_errorMonitor->VerifyFound();
3145 m_commandBuffer->EndCommandBuffer();
3146 }
3147
3148 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3149 // image to buffer
3150 {
3151 vk_testing::Buffer dst_buffer;
3152 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3153 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003154 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003155 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003156 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003157 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003158 m_errorMonitor->SetDesiredFailureMsg(
3159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3160 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003161 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003162 dst_buffer.handle(), 1, &copy_region);
3163 m_errorMonitor->VerifyFound();
3164 m_commandBuffer->EndCommandBuffer();
3165 }
3166}
3167
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003168TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003169 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003170
3171 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003172 src_image.Init(64, 64, 1, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003173 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003174 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003175 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003176 dst_image2.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003177
3178 VkImageBlit blitRegion = {};
3179 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3180 blitRegion.srcSubresource.baseArrayLayer = 0;
3181 blitRegion.srcSubresource.layerCount = 1;
3182 blitRegion.srcSubresource.mipLevel = 0;
3183 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3184 blitRegion.dstSubresource.baseArrayLayer = 0;
3185 blitRegion.dstSubresource.layerCount = 1;
3186 blitRegion.dstSubresource.mipLevel = 0;
3187
Dave Houlton34df4cb2016-12-01 16:43:06 -07003188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3189
3190 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3191 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003192
3193 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003194 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003195 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003196 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003197
3198 m_errorMonitor->VerifyFound();
3199
Dave Houlton34df4cb2016-12-01 16:43:06 -07003200 // Test should generate 2 VU failures
3201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003203
3204 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003205 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003206 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003207
Dave Houlton34df4cb2016-12-01 16:43:06 -07003208 // TODO: Note that this only verifies that at least one of the VU enums was found
3209 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003210 m_errorMonitor->VerifyFound();
3211
Tony Barbour552f6c02016-12-21 14:34:07 -07003212 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003213}
3214
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003215TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3216 VkResult err;
3217 bool pass;
3218
3219 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003220 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003221
3222 // If w/d/h granularity is 1, test is not meaningful
3223 // TODO: When virtual device limits are available, create a set of limits for this test that
3224 // will always have a granularity of > 1 for w, h, and d
3225 auto index = m_device->graphics_queue_node_index_;
3226 auto queue_family_properties = m_device->phy().queue_properties();
3227
3228 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3229 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3230 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3231 return;
3232 }
3233
3234 // Create two images of different types and try to copy between them
3235 VkImage srcImage;
3236 VkImage dstImage;
3237 VkDeviceMemory srcMem;
3238 VkDeviceMemory destMem;
3239 VkMemoryRequirements memReqs;
3240
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003241 VkImageCreateInfo image_create_info = {};
3242 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3243 image_create_info.pNext = NULL;
3244 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3245 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3246 image_create_info.extent.width = 32;
3247 image_create_info.extent.height = 32;
3248 image_create_info.extent.depth = 1;
3249 image_create_info.mipLevels = 1;
3250 image_create_info.arrayLayers = 4;
3251 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3252 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3253 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3254 image_create_info.flags = 0;
3255
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003256 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003257 ASSERT_VK_SUCCESS(err);
3258
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003259 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003260 ASSERT_VK_SUCCESS(err);
3261
3262 // Allocate memory
3263 VkMemoryAllocateInfo memAlloc = {};
3264 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3265 memAlloc.pNext = NULL;
3266 memAlloc.allocationSize = 0;
3267 memAlloc.memoryTypeIndex = 0;
3268
3269 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3270 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003271 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003272 ASSERT_TRUE(pass);
3273 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3274 ASSERT_VK_SUCCESS(err);
3275
3276 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3277 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003278 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003279 ASSERT_VK_SUCCESS(err);
3280 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3281 ASSERT_VK_SUCCESS(err);
3282
3283 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3284 ASSERT_VK_SUCCESS(err);
3285 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3286 ASSERT_VK_SUCCESS(err);
3287
Tony Barbour552f6c02016-12-21 14:34:07 -07003288 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003289 VkImageCopy copyRegion;
3290 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3291 copyRegion.srcSubresource.mipLevel = 0;
3292 copyRegion.srcSubresource.baseArrayLayer = 0;
3293 copyRegion.srcSubresource.layerCount = 1;
3294 copyRegion.srcOffset.x = 0;
3295 copyRegion.srcOffset.y = 0;
3296 copyRegion.srcOffset.z = 0;
3297 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3298 copyRegion.dstSubresource.mipLevel = 0;
3299 copyRegion.dstSubresource.baseArrayLayer = 0;
3300 copyRegion.dstSubresource.layerCount = 1;
3301 copyRegion.dstOffset.x = 0;
3302 copyRegion.dstOffset.y = 0;
3303 copyRegion.dstOffset.z = 0;
3304 copyRegion.extent.width = 1;
3305 copyRegion.extent.height = 1;
3306 copyRegion.extent.depth = 1;
3307
3308 // Introduce failure by setting srcOffset to a bad granularity value
3309 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3311 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003312 m_errorMonitor->VerifyFound();
3313
3314 // Introduce failure by setting extent to a bad granularity value
3315 copyRegion.srcOffset.y = 0;
3316 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3318 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003319 m_errorMonitor->VerifyFound();
3320
3321 // Now do some buffer/image copies
3322 vk_testing::Buffer buffer;
3323 VkMemoryPropertyFlags reqs = 0;
3324 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3325 VkBufferImageCopy region = {};
3326 region.bufferOffset = 0;
3327 region.bufferRowLength = 3;
3328 region.bufferImageHeight = 128;
3329 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3330 region.imageSubresource.layerCount = 1;
3331 region.imageExtent.height = 16;
3332 region.imageExtent.width = 16;
3333 region.imageExtent.depth = 1;
3334 region.imageOffset.x = 0;
3335 region.imageOffset.y = 0;
3336 region.imageOffset.z = 0;
3337
3338 // Introduce failure by setting bufferRowLength to a bad granularity value
3339 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3341 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3342 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003343 m_errorMonitor->VerifyFound();
3344 region.bufferRowLength = 128;
3345
3346 // Introduce failure by setting bufferOffset to a bad granularity value
3347 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3349 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3350 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003351 m_errorMonitor->VerifyFound();
3352 region.bufferOffset = 0;
3353
3354 // Introduce failure by setting bufferImageHeight to a bad granularity value
3355 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3357 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3358 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003359 m_errorMonitor->VerifyFound();
3360 region.bufferImageHeight = 128;
3361
3362 // Introduce failure by setting imageExtent to a bad granularity value
3363 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3365 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3366 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003367 m_errorMonitor->VerifyFound();
3368 region.imageExtent.width = 16;
3369
3370 // Introduce failure by setting imageOffset to a bad granularity value
3371 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3373 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3374 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003375 m_errorMonitor->VerifyFound();
3376
Tony Barbour552f6c02016-12-21 14:34:07 -07003377 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003378
3379 vkDestroyImage(m_device->device(), srcImage, NULL);
3380 vkDestroyImage(m_device->device(), dstImage, NULL);
3381 vkFreeMemory(m_device->device(), srcMem, NULL);
3382 vkFreeMemory(m_device->device(), destMem, NULL);
3383}
3384
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003385TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003386 TEST_DESCRIPTION(
3387 "Submit command buffer created using one queue family and "
3388 "attempt to submit them on a queue created in a different "
3389 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003390
Tony Barbour1fa09702017-03-16 12:09:08 -06003391 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003392
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003393 // This test is meaningless unless we have multiple queue families
3394 auto queue_family_properties = m_device->phy().queue_properties();
3395 if (queue_family_properties.size() < 2) {
3396 return;
3397 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003399 // Get safe index of another queue family
3400 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003401 VkQueue other_queue;
3402 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3403
3404 // Record an empty cmd buffer
3405 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3406 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3407 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3408 vkEndCommandBuffer(m_commandBuffer->handle());
3409
3410 // And submit on the wrong queue
3411 VkSubmitInfo submit_info = {};
3412 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3413 submit_info.commandBufferCount = 1;
3414 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003415 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003416
3417 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003418}
3419
Chris Forbes4c24a922016-11-16 08:59:10 +13003420TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003421 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003422
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003423 // There are no attachments, but refer to attachment 0.
3424 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003425 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003426 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003427 };
3428
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003429 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003430 VkRenderPass rp;
3431
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003432 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003434 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3435 m_errorMonitor->VerifyFound();
3436}
3437
Chris Forbesa58c4522016-09-28 15:19:39 +13003438TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3439 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003440 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003441
3442 // A renderpass with two subpasses, both writing the same attachment.
3443 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003444 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3445 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3446 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003447 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003448 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003449 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003450 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3451 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003452 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003453 VkSubpassDependency dep = {0,
3454 1,
3455 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3456 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3457 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3458 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3459 VK_DEPENDENCY_BY_REGION_BIT};
3460 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003461 VkRenderPass rp;
3462 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3463 ASSERT_VK_SUCCESS(err);
3464
3465 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003466 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003467 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3468
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003469 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003470 VkFramebuffer fb;
3471 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3472 ASSERT_VK_SUCCESS(err);
3473
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003474 char const *vsSource =
3475 "#version 450\n"
3476 "void main() { gl_Position = vec4(1); }\n";
3477 char const *fsSource =
3478 "#version 450\n"
3479 "layout(location=0) out vec4 color;\n"
3480 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003481
3482 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3483 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3484 VkPipelineObj pipe(m_device);
3485 pipe.AddColorAttachment();
3486 pipe.AddShader(&vs);
3487 pipe.AddShader(&fs);
3488 VkViewport view_port = {};
3489 m_viewports.push_back(view_port);
3490 pipe.SetViewport(m_viewports);
3491 VkRect2D rect = {};
3492 m_scissors.push_back(rect);
3493 pipe.SetScissor(m_scissors);
3494
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003495 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003496 VkPipelineLayout pl;
3497 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3498 ASSERT_VK_SUCCESS(err);
3499 pipe.CreateVKPipeline(pl, rp);
3500
Tony Barbour552f6c02016-12-21 14:34:07 -07003501 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003502
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003503 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3504 nullptr,
3505 rp,
3506 fb,
3507 {{
3508 0, 0,
3509 },
3510 {32, 32}},
3511 0,
3512 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003513
3514 // subtest 1: bind in the wrong subpass
3515 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3516 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003518 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3519 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3520 m_errorMonitor->VerifyFound();
3521
3522 vkCmdEndRenderPass(m_commandBuffer->handle());
3523
3524 // subtest 2: bind in correct subpass, then transition to next subpass
3525 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3526 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3527 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003529 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3530 m_errorMonitor->VerifyFound();
3531
3532 vkCmdEndRenderPass(m_commandBuffer->handle());
3533
Tony Barbour552f6c02016-12-21 14:34:07 -07003534 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003535
3536 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3537 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3538 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3539}
3540
Tony Barbour4e919972016-08-09 13:27:40 -06003541TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003542 TEST_DESCRIPTION(
3543 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3544 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003545 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3547
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3549 "Cannot execute a render pass with renderArea "
3550 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003551
3552 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3553 m_renderPassBeginInfo.renderArea.extent.width = 257;
3554 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003555 m_commandBuffer->BeginCommandBuffer();
3556 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003557 m_errorMonitor->VerifyFound();
3558}
3559
3560TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003561 TEST_DESCRIPTION(
3562 "Generate INDEPENDENT_BLEND by disabling independent "
3563 "blend and then specifying different blend states for two "
3564 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003565 VkPhysicalDeviceFeatures features = {};
3566 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003567 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003568
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3570 "Invalid Pipeline CreateInfo: If independent blend feature not "
3571 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003572
Cody Northropc31a84f2016-08-22 10:41:47 -06003573 VkDescriptorSetObj descriptorSet(m_device);
3574 descriptorSet.AppendDummy();
3575 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003576
Cody Northropc31a84f2016-08-22 10:41:47 -06003577 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003578 // Create a renderPass with two color attachments
3579 VkAttachmentReference attachments[2] = {};
3580 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003581 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003582 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3583
3584 VkSubpassDescription subpass = {};
3585 subpass.pColorAttachments = attachments;
3586 subpass.colorAttachmentCount = 2;
3587
3588 VkRenderPassCreateInfo rpci = {};
3589 rpci.subpassCount = 1;
3590 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003591 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003592
Tony Barbourffd60bd2017-03-09 12:04:55 -07003593 VkAttachmentDescription attach_desc[2] = {};
3594 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3595 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3596 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3597 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3598 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3599 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3600 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3601 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003602
Tony Barbourffd60bd2017-03-09 12:04:55 -07003603 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003604 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3605
3606 VkRenderPass renderpass;
3607 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003608 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003609 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003610
Cody Northropc31a84f2016-08-22 10:41:47 -06003611 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3612 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3613 att_state1.blendEnable = VK_TRUE;
3614 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3615 att_state2.blendEnable = VK_FALSE;
3616 pipeline.AddColorAttachment(0, &att_state1);
3617 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003618 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003619 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003620 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003621}
3622
Mike Weiblen40b160e2017-02-06 19:21:52 -07003623// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3624TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3625 TEST_DESCRIPTION(
3626 "Create a graphics pipeline that is incompatible with the requirements "
3627 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003628 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003629
3630 VkDescriptorSetObj ds_obj(m_device);
3631 ds_obj.AppendDummy();
3632 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3633
3634 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3635
3636 VkPipelineColorBlendAttachmentState att_state1 = {};
3637 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3638 att_state1.blendEnable = VK_TRUE;
3639
3640 VkRenderpassObj rp_obj(m_device);
3641
3642 {
3643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3644 VkPipelineObj pipeline(m_device);
3645 pipeline.AddShader(&vs_obj);
3646 pipeline.AddColorAttachment(0, &att_state1);
3647
3648 VkGraphicsPipelineCreateInfo info = {};
3649 pipeline.InitGraphicsPipelineCreateInfo(&info);
3650 info.pColorBlendState = nullptr;
3651
3652 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3653 m_errorMonitor->VerifyFound();
3654 }
3655}
3656
Cort Stratton7547f772017-05-04 15:18:52 -07003657TEST_F(VkLayerTest, CreateRenderPassAttachments) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003658 TEST_DESCRIPTION(
Cort Stratton7547f772017-05-04 15:18:52 -07003659 "Ensure that CreateRenderPass produces the expected validation errors "
3660 "when a subpass's attachments violate the valid usage conditions.");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003661
Tony Barbour1fa09702017-03-16 12:09:08 -06003662 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003663
Cort Stratton7547f772017-05-04 15:18:52 -07003664 std::vector<VkAttachmentDescription> attachments = {
3665 // input attachments
3666 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3667 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_GENERAL,
3668 VK_IMAGE_LAYOUT_GENERAL},
3669 // color attachments
3670 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3671 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3672 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3673 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3674 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3675 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3676 // depth attachment
3677 {0, VK_FORMAT_D24_UNORM_S8_UINT, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3678 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
3679 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
3680 // resolve attachment
3681 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3682 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3683 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3684 // preserve attachments
3685 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3686 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3687 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3688 };
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003689
Cort Stratton7547f772017-05-04 15:18:52 -07003690 std::vector<VkAttachmentReference> input = {
3691 {0, VK_IMAGE_LAYOUT_GENERAL},
3692 };
3693 std::vector<VkAttachmentReference> color = {
3694 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {2, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3695 };
3696 VkAttachmentReference depth = {3, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
3697 std::vector<VkAttachmentReference> resolve = {
3698 {4, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3699 };
3700 std::vector<uint32_t> preserve = {5};
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003701
Cort Stratton7547f772017-05-04 15:18:52 -07003702 VkSubpassDescription subpass = {0,
3703 VK_PIPELINE_BIND_POINT_GRAPHICS,
3704 (uint32_t)input.size(),
3705 input.data(),
3706 (uint32_t)color.size(),
3707 color.data(),
3708 resolve.data(),
3709 &depth,
3710 (uint32_t)preserve.size(),
3711 preserve.data()};
3712
3713 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3714 nullptr,
3715 0,
3716 (uint32_t)attachments.size(),
3717 attachments.data(),
3718 1,
3719 &subpass,
3720 0,
3721 nullptr};
3722
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003723 VkRenderPass rp;
Cort Stratton7547f772017-05-04 15:18:52 -07003724 VkResult err;
3725 // Test too many color attachments
3726 {
3727 std::vector<VkAttachmentReference> too_many_colors(m_device->props.limits.maxColorAttachments + 1, color[0]);
3728 subpass.colorAttachmentCount = (uint32_t)too_many_colors.size();
3729 subpass.pColorAttachments = too_many_colors.data();
3730 subpass.pResolveAttachments = NULL;
3731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00348);
3732 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3733 m_errorMonitor->VerifyFound();
3734 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3735 subpass.colorAttachmentCount = (uint32_t)color.size();
3736 subpass.pColorAttachments = color.data();
3737 subpass.pResolveAttachments = resolve.data();
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003738 }
Cort Stratton7547f772017-05-04 15:18:52 -07003739 // Test sample count mismatch between color buffers
3740 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3742 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003743 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003744 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003745 attachments[subpass.pColorAttachments[1].attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3746 // Test sample count mismatch between color buffers and depth buffer
3747 attachments[subpass.pDepthStencilAttachment->attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3749 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003750 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003751 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003752 attachments[subpass.pDepthStencilAttachment->attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3753 // Test resolve attachment with UNUSED color attachment
3754 color[0].attachment = VK_ATTACHMENT_UNUSED;
3755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00350);
3756 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003757 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003758 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003759 color[0].attachment = 1;
3760 // Test resolve from a single-sampled color attachment
3761 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3762 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_1_BIT; // avoid mismatch (00337)
3763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00351);
3764 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3765 m_errorMonitor->VerifyFound();
3766 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3767 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3768 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3769 // Test resolve to a multi-sampled resolve attachment
3770 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00352);
3772 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3773 m_errorMonitor->VerifyFound();
3774 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3775 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3776 // Test with color/resolve format mismatch
3777 attachments[subpass.pColorAttachments[0].attachment].format = VK_FORMAT_R8G8B8A8_SRGB;
3778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00353);
3779 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3780 m_errorMonitor->VerifyFound();
3781 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3782 attachments[subpass.pColorAttachments[0].attachment].format = attachments[subpass.pResolveAttachments[0].attachment].format;
3783 // Test for UNUSED preserve attachments
3784 preserve[0] = VK_ATTACHMENT_UNUSED;
3785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00356);
3786 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3787 m_errorMonitor->VerifyFound();
3788 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3789 preserve[0] = 5;
3790 // Test for preserve attachments used elsewhere in the subpass
3791 color[0].attachment = preserve[0];
3792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00357);
3793 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3794 m_errorMonitor->VerifyFound();
3795 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3796 color[0].attachment = 1;
3797 // test for layout mismatch between input attachment and color attachment
3798 input[0].attachment = color[0].attachment;
3799 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3801 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3802 m_errorMonitor->VerifyFound();
3803 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3804 input[0].attachment = 0;
3805 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3806 // test for layout mismatch between input attachment and depth attachment
3807 input[0].attachment = depth.attachment;
3808 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3810 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3811 m_errorMonitor->VerifyFound();
3812 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3813 input[0].attachment = 0;
3814 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3815 // Test for attachment used first as input with loadOp=CLEAR
3816 {
3817 std::vector<VkSubpassDescription> subpasses = {subpass, subpass, subpass};
3818 subpasses[0].inputAttachmentCount = 0;
3819 subpasses[1].inputAttachmentCount = 0;
3820 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
3821 VkRenderPassCreateInfo rpci_multipass = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3822 nullptr,
3823 0,
3824 (uint32_t)attachments.size(),
3825 attachments.data(),
3826 (uint32_t)subpasses.size(),
3827 subpasses.data(),
3828 0,
3829 nullptr};
3830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00349);
3831 err = vkCreateRenderPass(m_device->device(), &rpci_multipass, nullptr, &rp);
3832 m_errorMonitor->VerifyFound();
3833 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3834 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
3835 }
Chris Forbes3f128ef2016-06-29 14:58:53 +12003836}
3837
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003838TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003839 TEST_DESCRIPTION(
3840 "Hit errors when attempting to create a framebuffer :\n"
3841 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3842 " 2. Use a color image as depthStencil attachment\n"
3843 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3844 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3845 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3846 " 6. Framebuffer attachment where dimensions don't match\n"
Cort Stratton8133ec22017-04-27 16:25:03 +02003847 " 7. Framebuffer attachment where dimensions don't match\n"
3848 " 8. Framebuffer attachment w/o identity swizzle\n"
3849 " 9. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003850
Tony Barbour1fa09702017-03-16 12:09:08 -06003851 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3853
Cort Stratton8133ec22017-04-27 16:25:03 +02003854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00404);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003855
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003856 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003857 VkAttachmentReference attach = {};
3858 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3859 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003860 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003861 VkRenderPassCreateInfo rpci = {};
3862 rpci.subpassCount = 1;
3863 rpci.pSubpasses = &subpass;
3864 rpci.attachmentCount = 1;
3865 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003866 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003867 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003868 rpci.pAttachments = &attach_desc;
3869 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3870 VkRenderPass rp;
3871 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3872 ASSERT_VK_SUCCESS(err);
3873
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003874 VkImageView ivs[2];
3875 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3876 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003877 VkFramebufferCreateInfo fb_info = {};
3878 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3879 fb_info.pNext = NULL;
3880 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003881 // Set mis-matching attachmentCount
3882 fb_info.attachmentCount = 2;
3883 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003884 fb_info.width = 100;
3885 fb_info.height = 100;
3886 fb_info.layers = 1;
3887
3888 VkFramebuffer fb;
3889 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3890
3891 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892 if (err == VK_SUCCESS) {
3893 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3894 }
3895 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003896
3897 // Create a renderPass with a depth-stencil attachment created with
3898 // IMAGE_USAGE_COLOR_ATTACHMENT
3899 // Add our color attachment to pDepthStencilAttachment
3900 subpass.pDepthStencilAttachment = &attach;
3901 subpass.pColorAttachments = NULL;
3902 VkRenderPass rp_ds;
3903 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3904 ASSERT_VK_SUCCESS(err);
3905 // Set correct attachment count, but attachment has COLOR usage bit set
3906 fb_info.attachmentCount = 1;
3907 fb_info.renderPass = rp_ds;
3908
Cort Stratton8133ec22017-04-27 16:25:03 +02003909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00406);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003910 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3911
3912 m_errorMonitor->VerifyFound();
3913 if (err == VK_SUCCESS) {
3914 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3915 }
3916 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003917
3918 // Create new renderpass with alternate attachment format from fb
3919 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3920 subpass.pDepthStencilAttachment = NULL;
3921 subpass.pColorAttachments = &attach;
3922 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3923 ASSERT_VK_SUCCESS(err);
3924
3925 // Cause error due to mis-matched formats between rp & fb
3926 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3927 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00408);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003929 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3930
3931 m_errorMonitor->VerifyFound();
3932 if (err == VK_SUCCESS) {
3933 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3934 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003935 vkDestroyRenderPass(m_device->device(), rp, NULL);
3936
3937 // Create new renderpass with alternate sample count from fb
3938 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3939 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3940 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3941 ASSERT_VK_SUCCESS(err);
3942
3943 // Cause error due to mis-matched sample count between rp & fb
3944 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00409);
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003946 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3947
3948 m_errorMonitor->VerifyFound();
3949 if (err == VK_SUCCESS) {
3950 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3951 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003952
3953 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003954
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003955 {
3956 // Create an image with 2 mip levels.
3957 VkImageObj image(m_device);
3958 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3959 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003960
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003961 // Create a image view with two mip levels.
3962 VkImageView view;
3963 VkImageViewCreateInfo ivci = {};
3964 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3965 ivci.image = image.handle();
3966 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3967 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3968 ivci.subresourceRange.layerCount = 1;
3969 ivci.subresourceRange.baseMipLevel = 0;
3970 // Set level count to 2 (only 1 is allowed for FB attachment)
3971 ivci.subresourceRange.levelCount = 2;
3972 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3973 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3974 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003975
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003976 // Re-create renderpass to have matching sample count
3977 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3978 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3979 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003980
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003981 fb_info.renderPass = rp;
3982 fb_info.pAttachments = &view;
Cort Stratton8133ec22017-04-27 16:25:03 +02003983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00411);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003984 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3985
3986 m_errorMonitor->VerifyFound();
3987 if (err == VK_SUCCESS) {
3988 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3989 }
3990 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003991 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003992
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003993 // Update view to original color buffer and grow FB dimensions too big
3994 fb_info.pAttachments = ivs;
3995 fb_info.height = 1024;
3996 fb_info.width = 1024;
3997 fb_info.layers = 2;
Cort Stratton8133ec22017-04-27 16:25:03 +02003998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003999 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4000
4001 m_errorMonitor->VerifyFound();
4002 if (err == VK_SUCCESS) {
4003 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4004 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004005
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004006 {
4007 // Create an image with one mip level.
4008 VkImageObj image(m_device);
4009 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4010 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004011
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004012 // Create view attachment with non-identity swizzle
4013 VkImageView view;
4014 VkImageViewCreateInfo ivci = {};
4015 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4016 ivci.image = image.handle();
4017 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4018 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4019 ivci.subresourceRange.layerCount = 1;
4020 ivci.subresourceRange.baseMipLevel = 0;
4021 ivci.subresourceRange.levelCount = 1;
4022 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4023 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4024 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4025 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4026 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4027 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4028 ASSERT_VK_SUCCESS(err);
4029
4030 fb_info.pAttachments = &view;
4031 fb_info.height = 100;
4032 fb_info.width = 100;
4033 fb_info.layers = 1;
4034
Cort Stratton8133ec22017-04-27 16:25:03 +02004035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00412);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004036 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4037
4038 m_errorMonitor->VerifyFound();
4039 if (err == VK_SUCCESS) {
4040 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4041 }
4042 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004043 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004044
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004045 // reset attachment to color attachment
4046 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004047
4048 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004049 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004050 fb_info.height = 100;
4051 fb_info.layers = 1;
4052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Cort Stratton8133ec22017-04-27 16:25:03 +02004053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004054 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004055 m_errorMonitor->VerifyFound();
4056 if (err == VK_SUCCESS) {
4057 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4058 }
4059 // and width=0
4060 fb_info.width = 0;
4061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02806);
4062 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004063 m_errorMonitor->VerifyFound();
4064 if (err == VK_SUCCESS) {
4065 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4066 }
4067
4068 // Request fb that exceeds max height
4069 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004070 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004071 fb_info.layers = 1;
4072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Cort Stratton8133ec22017-04-27 16:25:03 +02004073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004074 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004075 m_errorMonitor->VerifyFound();
4076 if (err == VK_SUCCESS) {
4077 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4078 }
4079 // and height=0
4080 fb_info.height = 0;
4081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02807);
4082 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004083 m_errorMonitor->VerifyFound();
4084 if (err == VK_SUCCESS) {
4085 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4086 }
4087
4088 // Request fb that exceeds max layers
4089 fb_info.width = 100;
4090 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004091 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Cort Stratton8133ec22017-04-27 16:25:03 +02004093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004094 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004095 m_errorMonitor->VerifyFound();
4096 if (err == VK_SUCCESS) {
4097 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4098 }
4099 // and layers=0
4100 fb_info.layers = 0;
4101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02808);
4102 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004103 m_errorMonitor->VerifyFound();
4104 if (err == VK_SUCCESS) {
4105 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4106 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004107
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004108 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004109}
4110
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004111TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004112 TEST_DESCRIPTION(
4113 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4114 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004115
Tony Barbour1fa09702017-03-16 12:09:08 -06004116 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004117 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4119 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004120 m_errorMonitor->VerifyFound();
4121}
4122
4123TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004124 TEST_DESCRIPTION(
4125 "Run a simple draw calls to validate failure when Line Width dynamic "
4126 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004127
Tony Barbour1fa09702017-03-16 12:09:08 -06004128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004129 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4131 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004132 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133}
4134
4135TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004136 TEST_DESCRIPTION(
4137 "Run a simple draw calls to validate failure when Viewport dynamic "
4138 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004139
Tony Barbour1fa09702017-03-16 12:09:08 -06004140 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004141 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4143 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004144 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004145 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004146}
4147
4148TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004149 TEST_DESCRIPTION(
4150 "Run a simple draw calls to validate failure when Scissor dynamic "
4151 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004152
Tony Barbour1fa09702017-03-16 12:09:08 -06004153 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004154 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4156 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004158 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159}
4160
Cortd713fe82016-07-27 09:51:27 -07004161TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004162 TEST_DESCRIPTION(
4163 "Run a simple draw calls to validate failure when Blend Constants "
4164 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004165
Tony Barbour1fa09702017-03-16 12:09:08 -06004166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004167 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4169 "Dynamic blend constants state not set for this command buffer");
4170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004171 m_errorMonitor->VerifyFound();
4172}
4173
4174TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4177 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004180 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004181 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004182 return;
4183 }
4184 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic depth bounds state not set for this command buffer");
4187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
4191TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4194 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004197 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic stencil read mask state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004202}
4203
4204TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4207 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004210 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4212 "Dynamic stencil write mask state not set for this command buffer");
4213 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004214 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004215}
4216
4217TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004218 TEST_DESCRIPTION(
4219 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4220 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004221
Tony Barbour1fa09702017-03-16 12:09:08 -06004222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004223 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "Dynamic stencil reference state not set for this command buffer");
4226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004228}
4229
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004230TEST_F(VkLayerTest, IndexBufferNotBound) {
4231 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004232
Tony Barbour1fa09702017-03-16 12:09:08 -06004233 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Index buffer object not bound to this command buffer when Indexed ");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004237 m_errorMonitor->VerifyFound();
4238}
4239
Karl Schultz6addd812016-02-02 17:17:23 -07004240TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4243 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004246 ASSERT_NO_FATAL_FAILURE(InitViewport());
4247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4248
Karl Schultz6addd812016-02-02 17:17:23 -07004249 // We luck out b/c by default the framework creates CB w/ the
4250 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004251 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004253 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004254
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004255 // Bypass framework since it does the waits automatically
4256 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004257 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004258 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4259 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004260 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004261 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004262 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004263 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004266 submit_info.pSignalSemaphores = NULL;
4267
Chris Forbes40028e22016-06-13 09:59:34 +12004268 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004269 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004270 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Karl Schultz6addd812016-02-02 17:17:23 -07004272 // Cause validation error by re-submitting cmd buffer that should only be
4273 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004274 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004275 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004277 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004278}
4279
Karl Schultz6addd812016-02-02 17:17:23 -07004280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004281 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004282 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004283
Tony Barbour1fa09702017-03-16 12:09:08 -06004284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004286
Karl Schultz6addd812016-02-02 17:17:23 -07004287 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4288 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004291 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004292
4293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4295 ds_pool_ci.pNext = NULL;
4296 ds_pool_ci.flags = 0;
4297 ds_pool_ci.maxSets = 1;
4298 ds_pool_ci.poolSizeCount = 1;
4299 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004300
4301 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004303 ASSERT_VK_SUCCESS(err);
4304
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004305 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4306 dsl_binding_samp.binding = 0;
4307 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4308 dsl_binding_samp.descriptorCount = 1;
4309 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4310 dsl_binding_samp.pImmutableSamplers = NULL;
4311
4312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4314 ds_layout_ci.pNext = NULL;
4315 ds_layout_ci.bindingCount = 1;
4316 ds_layout_ci.pBindings = &dsl_binding_samp;
4317
4318 VkDescriptorSetLayout ds_layout_samp;
4319 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4320 ASSERT_VK_SUCCESS(err);
4321
4322 // Try to allocate 2 sets when pool only has 1 set
4323 VkDescriptorSet descriptor_sets[2];
4324 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4325 VkDescriptorSetAllocateInfo alloc_info = {};
4326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4327 alloc_info.descriptorSetCount = 2;
4328 alloc_info.descriptorPool = ds_pool;
4329 alloc_info.pSetLayouts = set_layouts;
4330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4331 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4332 m_errorMonitor->VerifyFound();
4333
4334 alloc_info.descriptorSetCount = 1;
4335 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004337 dsl_binding.binding = 0;
4338 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4339 dsl_binding.descriptorCount = 1;
4340 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4341 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
Karl Schultz6addd812016-02-02 17:17:23 -07004343 ds_layout_ci.bindingCount = 1;
4344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004346 VkDescriptorSetLayout ds_layout_ub;
4347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004348 ASSERT_VK_SUCCESS(err);
4349
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004350 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004351 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004352 alloc_info.pSetLayouts = &ds_layout_ub;
4353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4354 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004356 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004357
Karl Schultz2825ab92016-12-02 08:23:14 -07004358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361}
4362
Karl Schultz6addd812016-02-02 17:17:23 -07004363TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4364 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004365
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004367
Tony Barbour1fa09702017-03-16 12:09:08 -06004368 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004370
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004371 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004372 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4373 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004374
4375 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004376 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4377 ds_pool_ci.pNext = NULL;
4378 ds_pool_ci.maxSets = 1;
4379 ds_pool_ci.poolSizeCount = 1;
4380 ds_pool_ci.flags = 0;
4381 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4382 // app can only call vkResetDescriptorPool on this pool.;
4383 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004384
4385 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004387 ASSERT_VK_SUCCESS(err);
4388
4389 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004390 dsl_binding.binding = 0;
4391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4392 dsl_binding.descriptorCount = 1;
4393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4394 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
4396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4398 ds_layout_ci.pNext = NULL;
4399 ds_layout_ci.bindingCount = 1;
4400 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
4402 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004404 ASSERT_VK_SUCCESS(err);
4405
4406 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004407 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004409 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004410 alloc_info.descriptorPool = ds_pool;
4411 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004413 ASSERT_VK_SUCCESS(err);
4414
4415 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004417
Chia-I Wuf7458c52015-10-26 21:10:41 +08004418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004420}
4421
Karl Schultz6addd812016-02-02 17:17:23 -07004422TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004423 // Attempt to clear Descriptor Pool with bad object.
4424 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004425
Tony Barbour1fa09702017-03-16 12:09:08 -06004426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004428 uint64_t fake_pool_handle = 0xbaad6001;
4429 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4430 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004432}
4433
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004434TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004435 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4436 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004437 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004438 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004439
4440 uint64_t fake_set_handle = 0xbaad6001;
4441 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004442 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004444
Tony Barbour1fa09702017-03-16 12:09:08 -06004445 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004446
4447 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4448 layout_bindings[0].binding = 0;
4449 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4450 layout_bindings[0].descriptorCount = 1;
4451 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4452 layout_bindings[0].pImmutableSamplers = NULL;
4453
4454 VkDescriptorSetLayout descriptor_set_layout;
4455 VkDescriptorSetLayoutCreateInfo dslci = {};
4456 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4457 dslci.pNext = NULL;
4458 dslci.bindingCount = 1;
4459 dslci.pBindings = layout_bindings;
4460 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004461 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004462
4463 VkPipelineLayout pipeline_layout;
4464 VkPipelineLayoutCreateInfo plci = {};
4465 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4466 plci.pNext = NULL;
4467 plci.setLayoutCount = 1;
4468 plci.pSetLayouts = &descriptor_set_layout;
4469 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004470 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004471
Tony Barbour552f6c02016-12-21 14:34:07 -07004472 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004473 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4474 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004475 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004476 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4478 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479}
4480
Karl Schultz6addd812016-02-02 17:17:23 -07004481TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004482 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4483 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004484 uint64_t fake_layout_handle = 0xbaad6001;
4485 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488 VkPipelineLayout pipeline_layout;
4489 VkPipelineLayoutCreateInfo plci = {};
4490 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4491 plci.pNext = NULL;
4492 plci.setLayoutCount = 1;
4493 plci.pSetLayouts = &bad_layout;
4494 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4495
4496 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004497}
4498
Mark Muellerd4914412016-06-13 17:52:06 -06004499TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004500 TEST_DESCRIPTION(
4501 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4502 "1) A uniform buffer update must have a valid buffer index."
4503 "2) When using an array of descriptors in a single WriteDescriptor,"
4504 " the descriptor types and stageflags must all be the same."
4505 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004506
Mike Weiblena6666382017-01-05 15:16:11 -07004507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004508
Tony Barbour1fa09702017-03-16 12:09:08 -06004509 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004510 VkDescriptorPoolSize ds_type_count[4] = {};
4511 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4512 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004513 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004514 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004515 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004516 ds_type_count[2].descriptorCount = 1;
4517 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4518 ds_type_count[3].descriptorCount = 1;
4519
4520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4522 ds_pool_ci.maxSets = 1;
4523 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4524 ds_pool_ci.pPoolSizes = ds_type_count;
4525
4526 VkDescriptorPool ds_pool;
4527 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4528 ASSERT_VK_SUCCESS(err);
4529
Mark Muellerb9896722016-06-16 09:54:29 -06004530 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004531 layout_binding[0].binding = 0;
4532 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4533 layout_binding[0].descriptorCount = 1;
4534 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4535 layout_binding[0].pImmutableSamplers = NULL;
4536
4537 layout_binding[1].binding = 1;
4538 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4539 layout_binding[1].descriptorCount = 1;
4540 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4541 layout_binding[1].pImmutableSamplers = NULL;
4542
4543 VkSamplerCreateInfo sampler_ci = {};
4544 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4545 sampler_ci.pNext = NULL;
4546 sampler_ci.magFilter = VK_FILTER_NEAREST;
4547 sampler_ci.minFilter = VK_FILTER_NEAREST;
4548 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4549 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4550 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4551 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4552 sampler_ci.mipLodBias = 1.0;
4553 sampler_ci.anisotropyEnable = VK_FALSE;
4554 sampler_ci.maxAnisotropy = 1;
4555 sampler_ci.compareEnable = VK_FALSE;
4556 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4557 sampler_ci.minLod = 1.0;
4558 sampler_ci.maxLod = 1.0;
4559 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4560 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4561 VkSampler sampler;
4562
4563 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4564 ASSERT_VK_SUCCESS(err);
4565
4566 layout_binding[2].binding = 2;
4567 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4568 layout_binding[2].descriptorCount = 1;
4569 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4570 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4571
Mark Muellerd4914412016-06-13 17:52:06 -06004572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4574 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4575 ds_layout_ci.pBindings = layout_binding;
4576 VkDescriptorSetLayout ds_layout;
4577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4578 ASSERT_VK_SUCCESS(err);
4579
4580 VkDescriptorSetAllocateInfo alloc_info = {};
4581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4582 alloc_info.descriptorSetCount = 1;
4583 alloc_info.descriptorPool = ds_pool;
4584 alloc_info.pSetLayouts = &ds_layout;
4585 VkDescriptorSet descriptorSet;
4586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4587 ASSERT_VK_SUCCESS(err);
4588
4589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4591 pipeline_layout_ci.pNext = NULL;
4592 pipeline_layout_ci.setLayoutCount = 1;
4593 pipeline_layout_ci.pSetLayouts = &ds_layout;
4594
4595 VkPipelineLayout pipeline_layout;
4596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4597 ASSERT_VK_SUCCESS(err);
4598
Mark Mueller5c838ce2016-06-16 09:54:29 -06004599 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004600 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4601 descriptor_write.dstSet = descriptorSet;
4602 descriptor_write.dstBinding = 0;
4603 descriptor_write.descriptorCount = 1;
4604 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4605
Mark Mueller5c838ce2016-06-16 09:54:29 -06004606 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004607 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4608 m_errorMonitor->VerifyFound();
4609
4610 // Create a buffer to update the descriptor with
4611 uint32_t qfi = 0;
4612 VkBufferCreateInfo buffCI = {};
4613 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4614 buffCI.size = 1024;
4615 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4616 buffCI.queueFamilyIndexCount = 1;
4617 buffCI.pQueueFamilyIndices = &qfi;
4618
4619 VkBuffer dyub;
4620 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4621 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004622
Tony Barboure132c5f2016-12-12 11:50:20 -07004623 VkDeviceMemory mem;
4624 VkMemoryRequirements mem_reqs;
4625 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4626
4627 VkMemoryAllocateInfo mem_alloc_info = {};
4628 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4629 mem_alloc_info.allocationSize = mem_reqs.size;
4630 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4631 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4632 ASSERT_VK_SUCCESS(err);
4633
4634 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4635 ASSERT_VK_SUCCESS(err);
4636
4637 VkDescriptorBufferInfo buffInfo[2] = {};
4638 buffInfo[0].buffer = dyub;
4639 buffInfo[0].offset = 0;
4640 buffInfo[0].range = 1024;
4641 buffInfo[1].buffer = dyub;
4642 buffInfo[1].offset = 0;
4643 buffInfo[1].range = 1024;
4644 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004645 descriptor_write.descriptorCount = 2;
4646
Mark Mueller5c838ce2016-06-16 09:54:29 -06004647 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
Mark Mueller5c838ce2016-06-16 09:54:29 -06004652 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4653 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004654 descriptor_write.dstBinding = 1;
4655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004656
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657 // Make pImageInfo index non-null to avoid complaints of it missing
4658 VkDescriptorImageInfo imageInfo = {};
4659 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4660 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4663 m_errorMonitor->VerifyFound();
4664
Mark Muellerd4914412016-06-13 17:52:06 -06004665 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004666 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004667 vkDestroySampler(m_device->device(), sampler, NULL);
4668 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4671}
4672
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004673TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004674 TEST_DESCRIPTION(
4675 "Attempt to draw with a command buffer that is invalid "
4676 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004677 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004678
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004679 VkBuffer buffer;
4680 VkDeviceMemory mem;
4681 VkMemoryRequirements mem_reqs;
4682
4683 VkBufferCreateInfo buf_info = {};
4684 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004685 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004686 buf_info.size = 256;
4687 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4688 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4689 ASSERT_VK_SUCCESS(err);
4690
4691 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4692
4693 VkMemoryAllocateInfo alloc_info = {};
4694 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4695 alloc_info.allocationSize = 256;
4696 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004697 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004698 if (!pass) {
4699 vkDestroyBuffer(m_device->device(), buffer, NULL);
4700 return;
4701 }
4702 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4703 ASSERT_VK_SUCCESS(err);
4704
4705 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4706 ASSERT_VK_SUCCESS(err);
4707
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004709 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004710 m_commandBuffer->EndCommandBuffer();
4711
Mark Lobodzinski33826372017-04-13 11:10:11 -06004712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004713 // Destroy buffer dependency prior to submit to cause ERROR
4714 vkDestroyBuffer(m_device->device(), buffer, NULL);
4715
4716 VkSubmitInfo submit_info = {};
4717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4718 submit_info.commandBufferCount = 1;
4719 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4720 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4721
4722 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004723 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724 vkFreeMemory(m_device->handle(), mem, NULL);
4725}
4726
Tobin Ehlisea413442016-09-28 10:23:59 -06004727TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4728 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4729
Tony Barbour1fa09702017-03-16 12:09:08 -06004730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4732
4733 VkDescriptorPoolSize ds_type_count;
4734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4735 ds_type_count.descriptorCount = 1;
4736
4737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4739 ds_pool_ci.maxSets = 1;
4740 ds_pool_ci.poolSizeCount = 1;
4741 ds_pool_ci.pPoolSizes = &ds_type_count;
4742
4743 VkDescriptorPool ds_pool;
4744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 VkDescriptorSetLayoutBinding layout_binding;
4748 layout_binding.binding = 0;
4749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4750 layout_binding.descriptorCount = 1;
4751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4752 layout_binding.pImmutableSamplers = NULL;
4753
4754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4756 ds_layout_ci.bindingCount = 1;
4757 ds_layout_ci.pBindings = &layout_binding;
4758 VkDescriptorSetLayout ds_layout;
4759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4760 ASSERT_VK_SUCCESS(err);
4761
4762 VkDescriptorSetAllocateInfo alloc_info = {};
4763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4764 alloc_info.descriptorSetCount = 1;
4765 alloc_info.descriptorPool = ds_pool;
4766 alloc_info.pSetLayouts = &ds_layout;
4767 VkDescriptorSet descriptor_set;
4768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4769 ASSERT_VK_SUCCESS(err);
4770
4771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4773 pipeline_layout_ci.pNext = NULL;
4774 pipeline_layout_ci.setLayoutCount = 1;
4775 pipeline_layout_ci.pSetLayouts = &ds_layout;
4776
4777 VkPipelineLayout pipeline_layout;
4778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4779 ASSERT_VK_SUCCESS(err);
4780
4781 VkBuffer buffer;
4782 uint32_t queue_family_index = 0;
4783 VkBufferCreateInfo buffer_create_info = {};
4784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4785 buffer_create_info.size = 1024;
4786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4787 buffer_create_info.queueFamilyIndexCount = 1;
4788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4789
4790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4791 ASSERT_VK_SUCCESS(err);
4792
4793 VkMemoryRequirements memory_reqs;
4794 VkDeviceMemory buffer_memory;
4795
4796 VkMemoryAllocateInfo memory_info = {};
4797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4798 memory_info.allocationSize = 0;
4799 memory_info.memoryTypeIndex = 0;
4800
4801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4802 memory_info.allocationSize = memory_reqs.size;
4803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4804 ASSERT_TRUE(pass);
4805
4806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4807 ASSERT_VK_SUCCESS(err);
4808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBufferView view;
4812 VkBufferViewCreateInfo bvci = {};
4813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4814 bvci.buffer = buffer;
4815 bvci.format = VK_FORMAT_R8_UNORM;
4816 bvci.range = VK_WHOLE_SIZE;
4817
4818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4819 ASSERT_VK_SUCCESS(err);
4820
4821 VkWriteDescriptorSet descriptor_write = {};
4822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4823 descriptor_write.dstSet = descriptor_set;
4824 descriptor_write.dstBinding = 0;
4825 descriptor_write.descriptorCount = 1;
4826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4827 descriptor_write.pTexelBufferView = &view;
4828
4829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004831 char const *vsSource =
4832 "#version 450\n"
4833 "\n"
4834 "out gl_PerVertex { \n"
4835 " vec4 gl_Position;\n"
4836 "};\n"
4837 "void main(){\n"
4838 " gl_Position = vec4(1);\n"
4839 "}\n";
4840 char const *fsSource =
4841 "#version 450\n"
4842 "\n"
4843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4844 "layout(location=0) out vec4 x;\n"
4845 "void main(){\n"
4846 " x = imageLoad(s, 0);\n"
4847 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4850 VkPipelineObj pipe(m_device);
4851 pipe.AddShader(&vs);
4852 pipe.AddShader(&fs);
4853 pipe.AddColorAttachment();
4854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4855
Mark Lobodzinski33826372017-04-13 11:10:11 -06004856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004857
Tony Barbour552f6c02016-12-21 14:34:07 -07004858 m_commandBuffer->BeginCommandBuffer();
4859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4860
Tobin Ehlisea413442016-09-28 10:23:59 -06004861 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4863 VkRect2D scissor = {{0, 0}, {16, 16}};
4864 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4865 // Bind pipeline to cmd buffer
4866 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4867 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4868 &descriptor_set, 0, nullptr);
4869 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004870 m_commandBuffer->EndRenderPass();
4871 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004872
4873 // Delete BufferView in order to invalidate cmd buffer
4874 vkDestroyBufferView(m_device->device(), view, NULL);
4875 // Now attempt submit of cmd buffer
4876 VkSubmitInfo submit_info = {};
4877 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4878 submit_info.commandBufferCount = 1;
4879 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4880 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4881 m_errorMonitor->VerifyFound();
4882
4883 // Clean-up
4884 vkDestroyBuffer(m_device->device(), buffer, NULL);
4885 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4889}
4890
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004891TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004892 TEST_DESCRIPTION(
4893 "Attempt to draw with a command buffer that is invalid "
4894 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004896
4897 VkImage image;
4898 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4899 VkImageCreateInfo image_create_info = {};
4900 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4901 image_create_info.pNext = NULL;
4902 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4903 image_create_info.format = tex_format;
4904 image_create_info.extent.width = 32;
4905 image_create_info.extent.height = 32;
4906 image_create_info.extent.depth = 1;
4907 image_create_info.mipLevels = 1;
4908 image_create_info.arrayLayers = 1;
4909 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4910 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004911 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004912 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004913 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004914 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004915 // Have to bind memory to image before recording cmd in cmd buffer using it
4916 VkMemoryRequirements mem_reqs;
4917 VkDeviceMemory image_mem;
4918 bool pass;
4919 VkMemoryAllocateInfo mem_alloc = {};
4920 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4921 mem_alloc.pNext = NULL;
4922 mem_alloc.memoryTypeIndex = 0;
4923 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4924 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004925 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004926 ASSERT_TRUE(pass);
4927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4928 ASSERT_VK_SUCCESS(err);
4929 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4930 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004931
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004933 VkClearColorValue ccv;
4934 ccv.float32[0] = 1.0f;
4935 ccv.float32[1] = 1.0f;
4936 ccv.float32[2] = 1.0f;
4937 ccv.float32[3] = 1.0f;
4938 VkImageSubresourceRange isr = {};
4939 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004940 isr.baseArrayLayer = 0;
4941 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004942 isr.layerCount = 1;
4943 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004944 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004945 m_commandBuffer->EndCommandBuffer();
4946
Mark Lobodzinski33826372017-04-13 11:10:11 -06004947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 // Destroy image dependency prior to submit to cause ERROR
4949 vkDestroyImage(m_device->device(), image, NULL);
4950
4951 VkSubmitInfo submit_info = {};
4952 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4953 submit_info.commandBufferCount = 1;
4954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4956
4957 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004958 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004959}
4960
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004961TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004962 TEST_DESCRIPTION(
4963 "Attempt to draw with a command buffer that is invalid "
4964 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004965 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004966 VkFormatProperties format_properties;
4967 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004968 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4969 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004970 return;
4971 }
4972
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4974
4975 VkImageCreateInfo image_ci = {};
4976 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4977 image_ci.pNext = NULL;
4978 image_ci.imageType = VK_IMAGE_TYPE_2D;
4979 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4980 image_ci.extent.width = 32;
4981 image_ci.extent.height = 32;
4982 image_ci.extent.depth = 1;
4983 image_ci.mipLevels = 1;
4984 image_ci.arrayLayers = 1;
4985 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4986 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004988 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4989 image_ci.flags = 0;
4990 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004991 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004992
4993 VkMemoryRequirements memory_reqs;
4994 VkDeviceMemory image_memory;
4995 bool pass;
4996 VkMemoryAllocateInfo memory_info = {};
4997 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4998 memory_info.pNext = NULL;
4999 memory_info.allocationSize = 0;
5000 memory_info.memoryTypeIndex = 0;
5001 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5002 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005003 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005004 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005005 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 ASSERT_VK_SUCCESS(err);
5007 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5008 ASSERT_VK_SUCCESS(err);
5009
5010 VkImageViewCreateInfo ivci = {
5011 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5012 nullptr,
5013 0,
5014 image,
5015 VK_IMAGE_VIEW_TYPE_2D,
5016 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5019 };
5020 VkImageView view;
5021 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5022 ASSERT_VK_SUCCESS(err);
5023
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005024 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005025 VkFramebuffer fb;
5026 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5027 ASSERT_VK_SUCCESS(err);
5028
5029 // Just use default renderpass with our framebuffer
5030 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005031 m_renderPassBeginInfo.renderArea.extent.width = 32;
5032 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005033 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005034 m_commandBuffer->BeginCommandBuffer();
5035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5036 m_commandBuffer->EndRenderPass();
5037 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005038 // Destroy image attached to framebuffer to invalidate cmd buffer
5039 vkDestroyImage(m_device->device(), image, NULL);
5040 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 QueueCommandBuffer(false);
5043 m_errorMonitor->VerifyFound();
5044
5045 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5046 vkDestroyImageView(m_device->device(), view, nullptr);
5047 vkFreeMemory(m_device->device(), image_memory, nullptr);
5048}
5049
Tobin Ehlisb329f992016-10-12 13:20:29 -06005050TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5051 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005052 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005053 VkFormatProperties format_properties;
5054 VkResult err = VK_SUCCESS;
5055 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5056
Tobin Ehlisb329f992016-10-12 13:20:29 -06005057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5058
5059 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005060 image.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005061 ASSERT_TRUE(image.initialized());
5062 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5063
5064 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5065 VkFramebuffer fb;
5066 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5067 ASSERT_VK_SUCCESS(err);
5068
5069 // Just use default renderpass with our framebuffer
5070 m_renderPassBeginInfo.framebuffer = fb;
5071 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005072 m_commandBuffer->BeginCommandBuffer();
5073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5074 m_commandBuffer->EndRenderPass();
5075 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005076 // Submit cmd buffer to put it in-flight
5077 VkSubmitInfo submit_info = {};
5078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5079 submit_info.commandBufferCount = 1;
5080 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5082 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005084 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5085 m_errorMonitor->VerifyFound();
5086 // Wait for queue to complete so we can safely destroy everything
5087 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005088 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5089 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5091}
5092
Tobin Ehlis88becd72016-09-21 14:33:41 -06005093TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5094 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005095 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005096 VkFormatProperties format_properties;
5097 VkResult err = VK_SUCCESS;
5098 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005099
Tobin Ehlis88becd72016-09-21 14:33:41 -06005100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5101
5102 VkImageCreateInfo image_ci = {};
5103 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5104 image_ci.pNext = NULL;
5105 image_ci.imageType = VK_IMAGE_TYPE_2D;
5106 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5107 image_ci.extent.width = 256;
5108 image_ci.extent.height = 256;
5109 image_ci.extent.depth = 1;
5110 image_ci.mipLevels = 1;
5111 image_ci.arrayLayers = 1;
5112 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5113 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005114 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005115 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5116 image_ci.flags = 0;
5117 VkImage image;
5118 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5119
5120 VkMemoryRequirements memory_reqs;
5121 VkDeviceMemory image_memory;
5122 bool pass;
5123 VkMemoryAllocateInfo memory_info = {};
5124 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5125 memory_info.pNext = NULL;
5126 memory_info.allocationSize = 0;
5127 memory_info.memoryTypeIndex = 0;
5128 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5129 memory_info.allocationSize = memory_reqs.size;
5130 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5131 ASSERT_TRUE(pass);
5132 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5133 ASSERT_VK_SUCCESS(err);
5134 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5135 ASSERT_VK_SUCCESS(err);
5136
5137 VkImageViewCreateInfo ivci = {
5138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5139 nullptr,
5140 0,
5141 image,
5142 VK_IMAGE_VIEW_TYPE_2D,
5143 VK_FORMAT_B8G8R8A8_UNORM,
5144 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5145 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5146 };
5147 VkImageView view;
5148 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5152 VkFramebuffer fb;
5153 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 // Just use default renderpass with our framebuffer
5157 m_renderPassBeginInfo.framebuffer = fb;
5158 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005159 m_commandBuffer->BeginCommandBuffer();
5160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5161 m_commandBuffer->EndRenderPass();
5162 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005163 // Submit cmd buffer to put it (and attached imageView) in-flight
5164 VkSubmitInfo submit_info = {};
5165 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5166 submit_info.commandBufferCount = 1;
5167 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5168 // Submit cmd buffer to put framebuffer and children in-flight
5169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5170 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005172 vkDestroyImage(m_device->device(), image, NULL);
5173 m_errorMonitor->VerifyFound();
5174 // Wait for queue to complete so we can safely destroy image and other objects
5175 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005176 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5177 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005178 vkDestroyImage(m_device->device(), image, NULL);
5179 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5180 vkDestroyImageView(m_device->device(), view, nullptr);
5181 vkFreeMemory(m_device->device(), image_memory, nullptr);
5182}
5183
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005184TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5185 TEST_DESCRIPTION("Delete in-use renderPass.");
5186
Tony Barbour1fa09702017-03-16 12:09:08 -06005187 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5189
5190 // Create simple renderpass
5191 VkAttachmentReference attach = {};
5192 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5193 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005194 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005195 subpass.pColorAttachments = &attach;
5196 VkRenderPassCreateInfo rpci = {};
5197 rpci.subpassCount = 1;
5198 rpci.pSubpasses = &subpass;
5199 rpci.attachmentCount = 1;
5200 VkAttachmentDescription attach_desc = {};
5201 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5202 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5203 rpci.pAttachments = &attach_desc;
5204 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5205 VkRenderPass rp;
5206 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5207 ASSERT_VK_SUCCESS(err);
5208
5209 // Create a pipeline that uses the given renderpass
5210 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5211 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5212
5213 VkPipelineLayout pipeline_layout;
5214 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5215 ASSERT_VK_SUCCESS(err);
5216
5217 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5218 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5219 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005220 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005221 vp_state_ci.pViewports = &vp;
5222 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005223 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005224 vp_state_ci.pScissors = &scissors;
5225
5226 VkPipelineShaderStageCreateInfo shaderStages[2];
5227 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5228
5229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005230 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005231 // but add it to be able to run on more devices
5232 shaderStages[0] = vs.GetStageCreateInfo();
5233 shaderStages[1] = fs.GetStageCreateInfo();
5234
5235 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5236 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5237
5238 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5239 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5240 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5241
5242 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5243 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5244 rs_ci.rasterizerDiscardEnable = true;
5245 rs_ci.lineWidth = 1.0f;
5246
5247 VkPipelineColorBlendAttachmentState att = {};
5248 att.blendEnable = VK_FALSE;
5249 att.colorWriteMask = 0xf;
5250
5251 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5252 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5253 cb_ci.attachmentCount = 1;
5254 cb_ci.pAttachments = &att;
5255
5256 VkGraphicsPipelineCreateInfo gp_ci = {};
5257 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5258 gp_ci.stageCount = 2;
5259 gp_ci.pStages = shaderStages;
5260 gp_ci.pVertexInputState = &vi_ci;
5261 gp_ci.pInputAssemblyState = &ia_ci;
5262 gp_ci.pViewportState = &vp_state_ci;
5263 gp_ci.pRasterizationState = &rs_ci;
5264 gp_ci.pColorBlendState = &cb_ci;
5265 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5266 gp_ci.layout = pipeline_layout;
5267 gp_ci.renderPass = rp;
5268
5269 VkPipelineCacheCreateInfo pc_ci = {};
5270 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5271
Dave Houlton756e6742017-03-23 14:33:22 -06005272 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005273 VkPipeline pipeline;
5274 VkPipelineCache pipe_cache;
5275 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5276 ASSERT_VK_SUCCESS(err);
5277
5278 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5279 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005280
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005281 // Bind pipeline to cmd buffer, will also bind renderpass
5282 m_commandBuffer->BeginCommandBuffer();
5283 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5284 m_commandBuffer->EndCommandBuffer();
5285
5286 VkSubmitInfo submit_info = {};
5287 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5288 submit_info.commandBufferCount = 1;
5289 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5290 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005291 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005292
5293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5294 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5295 m_errorMonitor->VerifyFound();
5296
5297 // Wait for queue to complete so we can safely destroy everything
5298 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005299 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005300 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005301 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5302 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5303 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5304 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5305}
5306
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005307TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005308 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005309 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005310
5311 VkImage image;
5312 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5313 VkImageCreateInfo image_create_info = {};
5314 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5315 image_create_info.pNext = NULL;
5316 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5317 image_create_info.format = tex_format;
5318 image_create_info.extent.width = 32;
5319 image_create_info.extent.height = 32;
5320 image_create_info.extent.depth = 1;
5321 image_create_info.mipLevels = 1;
5322 image_create_info.arrayLayers = 1;
5323 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5324 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005325 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005326 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005327 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005328 ASSERT_VK_SUCCESS(err);
5329 // Have to bind memory to image before recording cmd in cmd buffer using it
5330 VkMemoryRequirements mem_reqs;
5331 VkDeviceMemory image_mem;
5332 bool pass;
5333 VkMemoryAllocateInfo mem_alloc = {};
5334 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5335 mem_alloc.pNext = NULL;
5336 mem_alloc.memoryTypeIndex = 0;
5337 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5338 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005339 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005340 ASSERT_TRUE(pass);
5341 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5342 ASSERT_VK_SUCCESS(err);
5343
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005344 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005346 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005347
5348 m_commandBuffer->BeginCommandBuffer();
5349 VkClearColorValue ccv;
5350 ccv.float32[0] = 1.0f;
5351 ccv.float32[1] = 1.0f;
5352 ccv.float32[2] = 1.0f;
5353 ccv.float32[3] = 1.0f;
5354 VkImageSubresourceRange isr = {};
5355 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5356 isr.baseArrayLayer = 0;
5357 isr.baseMipLevel = 0;
5358 isr.layerCount = 1;
5359 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005360 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005361 m_commandBuffer->EndCommandBuffer();
5362
5363 m_errorMonitor->VerifyFound();
5364 vkDestroyImage(m_device->device(), image, NULL);
5365 vkFreeMemory(m_device->device(), image_mem, nullptr);
5366}
5367
5368TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005370 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005371
5372 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005373 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005374 VK_IMAGE_TILING_OPTIMAL, 0);
5375 ASSERT_TRUE(image.initialized());
5376
5377 VkBuffer buffer;
5378 VkDeviceMemory mem;
5379 VkMemoryRequirements mem_reqs;
5380
5381 VkBufferCreateInfo buf_info = {};
5382 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005383 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005384 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005385 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5386 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5387 ASSERT_VK_SUCCESS(err);
5388
5389 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5390
5391 VkMemoryAllocateInfo alloc_info = {};
5392 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005393 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005394 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005395 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005396 if (!pass) {
5397 vkDestroyBuffer(m_device->device(), buffer, NULL);
5398 return;
5399 }
5400 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5401 ASSERT_VK_SUCCESS(err);
5402
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005403 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005405 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005406 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005407 region.bufferRowLength = 16;
5408 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005409 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5410
5411 region.imageSubresource.layerCount = 1;
5412 region.imageExtent.height = 4;
5413 region.imageExtent.width = 4;
5414 region.imageExtent.depth = 1;
5415 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005416 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5417 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005418 m_commandBuffer->EndCommandBuffer();
5419
5420 m_errorMonitor->VerifyFound();
5421
5422 vkDestroyBuffer(m_device->device(), buffer, NULL);
5423 vkFreeMemory(m_device->handle(), mem, NULL);
5424}
5425
Tobin Ehlis85940f52016-07-07 16:57:21 -06005426TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005427 TEST_DESCRIPTION(
5428 "Attempt to draw with a command buffer that is invalid "
5429 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005430 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005431
5432 VkEvent event;
5433 VkEventCreateInfo evci = {};
5434 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5435 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5436 ASSERT_VK_SUCCESS(result);
5437
5438 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005439 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005440 m_commandBuffer->EndCommandBuffer();
5441
Mark Lobodzinski33826372017-04-13 11:10:11 -06005442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005443 // Destroy event dependency prior to submit to cause ERROR
5444 vkDestroyEvent(m_device->device(), event, NULL);
5445
5446 VkSubmitInfo submit_info = {};
5447 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5448 submit_info.commandBufferCount = 1;
5449 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5450 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5451
5452 m_errorMonitor->VerifyFound();
5453}
5454
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005455TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005456 TEST_DESCRIPTION(
5457 "Attempt to draw with a command buffer that is invalid "
5458 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005459 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005460
5461 VkQueryPool query_pool;
5462 VkQueryPoolCreateInfo qpci{};
5463 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5464 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5465 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005466 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005467 ASSERT_VK_SUCCESS(result);
5468
5469 m_commandBuffer->BeginCommandBuffer();
5470 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5471 m_commandBuffer->EndCommandBuffer();
5472
Mark Lobodzinski33826372017-04-13 11:10:11 -06005473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005474 // Destroy query pool dependency prior to submit to cause ERROR
5475 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5476
5477 VkSubmitInfo submit_info = {};
5478 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5479 submit_info.commandBufferCount = 1;
5480 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5482
5483 m_errorMonitor->VerifyFound();
5484}
5485
Tobin Ehlis24130d92016-07-08 15:50:53 -06005486TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005487 TEST_DESCRIPTION(
5488 "Attempt to draw with a command buffer that is invalid "
5489 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005490 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5492
5493 VkResult err;
5494
5495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5497
5498 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005499 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005500 ASSERT_VK_SUCCESS(err);
5501
5502 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5503 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5504 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005505 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005506 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005507 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005508 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005509 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005510
5511 VkPipelineShaderStageCreateInfo shaderStages[2];
5512 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5513
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005514 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005515 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005516 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005517 shaderStages[0] = vs.GetStageCreateInfo();
5518 shaderStages[1] = fs.GetStageCreateInfo();
5519
5520 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5521 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5522
5523 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5524 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5525 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5526
5527 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5528 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005529 rs_ci.rasterizerDiscardEnable = true;
5530 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005531
5532 VkPipelineColorBlendAttachmentState att = {};
5533 att.blendEnable = VK_FALSE;
5534 att.colorWriteMask = 0xf;
5535
5536 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5537 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5538 cb_ci.attachmentCount = 1;
5539 cb_ci.pAttachments = &att;
5540
5541 VkGraphicsPipelineCreateInfo gp_ci = {};
5542 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5543 gp_ci.stageCount = 2;
5544 gp_ci.pStages = shaderStages;
5545 gp_ci.pVertexInputState = &vi_ci;
5546 gp_ci.pInputAssemblyState = &ia_ci;
5547 gp_ci.pViewportState = &vp_state_ci;
5548 gp_ci.pRasterizationState = &rs_ci;
5549 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005550 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5551 gp_ci.layout = pipeline_layout;
5552 gp_ci.renderPass = renderPass();
5553
5554 VkPipelineCacheCreateInfo pc_ci = {};
5555 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5556
5557 VkPipeline pipeline;
5558 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005559 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005560 ASSERT_VK_SUCCESS(err);
5561
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005562 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005563 ASSERT_VK_SUCCESS(err);
5564
5565 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005566 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567 m_commandBuffer->EndCommandBuffer();
5568 // Now destroy pipeline in order to cause error when submitting
5569 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5570
Mark Lobodzinski33826372017-04-13 11:10:11 -06005571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005572
5573 VkSubmitInfo submit_info = {};
5574 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5575 submit_info.commandBufferCount = 1;
5576 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5577 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5578
5579 m_errorMonitor->VerifyFound();
5580 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5581 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5582}
5583
Tobin Ehlis31289162016-08-17 14:57:58 -06005584TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005585 TEST_DESCRIPTION(
5586 "Attempt to draw with a command buffer that is invalid "
5587 "due to a bound descriptor set with a buffer dependency "
5588 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005589 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005590 ASSERT_NO_FATAL_FAILURE(InitViewport());
5591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5592
5593 VkDescriptorPoolSize ds_type_count = {};
5594 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5595 ds_type_count.descriptorCount = 1;
5596
5597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5599 ds_pool_ci.pNext = NULL;
5600 ds_pool_ci.maxSets = 1;
5601 ds_pool_ci.poolSizeCount = 1;
5602 ds_pool_ci.pPoolSizes = &ds_type_count;
5603
5604 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005605 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005606 ASSERT_VK_SUCCESS(err);
5607
5608 VkDescriptorSetLayoutBinding dsl_binding = {};
5609 dsl_binding.binding = 0;
5610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5611 dsl_binding.descriptorCount = 1;
5612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5613 dsl_binding.pImmutableSamplers = NULL;
5614
5615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5617 ds_layout_ci.pNext = NULL;
5618 ds_layout_ci.bindingCount = 1;
5619 ds_layout_ci.pBindings = &dsl_binding;
5620 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005622 ASSERT_VK_SUCCESS(err);
5623
5624 VkDescriptorSet descriptorSet;
5625 VkDescriptorSetAllocateInfo alloc_info = {};
5626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5627 alloc_info.descriptorSetCount = 1;
5628 alloc_info.descriptorPool = ds_pool;
5629 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005631 ASSERT_VK_SUCCESS(err);
5632
5633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5635 pipeline_layout_ci.pNext = NULL;
5636 pipeline_layout_ci.setLayoutCount = 1;
5637 pipeline_layout_ci.pSetLayouts = &ds_layout;
5638
5639 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005641 ASSERT_VK_SUCCESS(err);
5642
5643 // Create a buffer to update the descriptor with
5644 uint32_t qfi = 0;
5645 VkBufferCreateInfo buffCI = {};
5646 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5647 buffCI.size = 1024;
5648 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5649 buffCI.queueFamilyIndexCount = 1;
5650 buffCI.pQueueFamilyIndices = &qfi;
5651
5652 VkBuffer buffer;
5653 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5654 ASSERT_VK_SUCCESS(err);
5655 // Allocate memory and bind to buffer so we can make it to the appropriate
5656 // error
5657 VkMemoryAllocateInfo mem_alloc = {};
5658 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5659 mem_alloc.pNext = NULL;
5660 mem_alloc.allocationSize = 1024;
5661 mem_alloc.memoryTypeIndex = 0;
5662
5663 VkMemoryRequirements memReqs;
5664 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005665 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005666 if (!pass) {
5667 vkDestroyBuffer(m_device->device(), buffer, NULL);
5668 return;
5669 }
5670
5671 VkDeviceMemory mem;
5672 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5673 ASSERT_VK_SUCCESS(err);
5674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5675 ASSERT_VK_SUCCESS(err);
5676 // Correctly update descriptor to avoid "NOT_UPDATED" error
5677 VkDescriptorBufferInfo buffInfo = {};
5678 buffInfo.buffer = buffer;
5679 buffInfo.offset = 0;
5680 buffInfo.range = 1024;
5681
5682 VkWriteDescriptorSet descriptor_write;
5683 memset(&descriptor_write, 0, sizeof(descriptor_write));
5684 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5685 descriptor_write.dstSet = descriptorSet;
5686 descriptor_write.dstBinding = 0;
5687 descriptor_write.descriptorCount = 1;
5688 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5689 descriptor_write.pBufferInfo = &buffInfo;
5690
5691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5692
5693 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005694 char const *vsSource =
5695 "#version 450\n"
5696 "\n"
5697 "out gl_PerVertex { \n"
5698 " vec4 gl_Position;\n"
5699 "};\n"
5700 "void main(){\n"
5701 " gl_Position = vec4(1);\n"
5702 "}\n";
5703 char const *fsSource =
5704 "#version 450\n"
5705 "\n"
5706 "layout(location=0) out vec4 x;\n"
5707 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5708 "void main(){\n"
5709 " x = vec4(bar.y);\n"
5710 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005711 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5712 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5713 VkPipelineObj pipe(m_device);
5714 pipe.AddShader(&vs);
5715 pipe.AddShader(&fs);
5716 pipe.AddColorAttachment();
5717 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5718
Tony Barbour552f6c02016-12-21 14:34:07 -07005719 m_commandBuffer->BeginCommandBuffer();
5720 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005721 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5722 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5723 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005724
5725 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5726 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5727
Tobin Ehlis31289162016-08-17 14:57:58 -06005728 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005729 m_commandBuffer->EndRenderPass();
5730 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005732 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5733 vkDestroyBuffer(m_device->device(), buffer, NULL);
5734 // Attempt to submit cmd buffer
5735 VkSubmitInfo submit_info = {};
5736 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5737 submit_info.commandBufferCount = 1;
5738 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5740 m_errorMonitor->VerifyFound();
5741 // Cleanup
5742 vkFreeMemory(m_device->device(), mem, NULL);
5743
5744 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5747}
5748
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005749TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005750 TEST_DESCRIPTION(
5751 "Attempt to draw with a command buffer that is invalid "
5752 "due to a bound descriptor sets with a combined image "
5753 "sampler having their image, sampler, and descriptor set "
5754 "each respectively destroyed and then attempting to "
5755 "submit associated cmd buffers. Attempt to destroy a "
5756 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005757 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005758 ASSERT_NO_FATAL_FAILURE(InitViewport());
5759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5760
5761 VkDescriptorPoolSize ds_type_count = {};
5762 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5763 ds_type_count.descriptorCount = 1;
5764
5765 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5766 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5767 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005768 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005769 ds_pool_ci.maxSets = 1;
5770 ds_pool_ci.poolSizeCount = 1;
5771 ds_pool_ci.pPoolSizes = &ds_type_count;
5772
5773 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005774 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005775 ASSERT_VK_SUCCESS(err);
5776
5777 VkDescriptorSetLayoutBinding dsl_binding = {};
5778 dsl_binding.binding = 0;
5779 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5780 dsl_binding.descriptorCount = 1;
5781 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5782 dsl_binding.pImmutableSamplers = NULL;
5783
5784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5785 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5786 ds_layout_ci.pNext = NULL;
5787 ds_layout_ci.bindingCount = 1;
5788 ds_layout_ci.pBindings = &dsl_binding;
5789 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005790 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791 ASSERT_VK_SUCCESS(err);
5792
5793 VkDescriptorSet descriptorSet;
5794 VkDescriptorSetAllocateInfo alloc_info = {};
5795 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5796 alloc_info.descriptorSetCount = 1;
5797 alloc_info.descriptorPool = ds_pool;
5798 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005799 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005800 ASSERT_VK_SUCCESS(err);
5801
5802 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5803 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5804 pipeline_layout_ci.pNext = NULL;
5805 pipeline_layout_ci.setLayoutCount = 1;
5806 pipeline_layout_ci.pSetLayouts = &ds_layout;
5807
5808 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005810 ASSERT_VK_SUCCESS(err);
5811
5812 // Create images to update the descriptor with
5813 VkImage image;
5814 VkImage image2;
5815 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5816 const int32_t tex_width = 32;
5817 const int32_t tex_height = 32;
5818 VkImageCreateInfo image_create_info = {};
5819 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5820 image_create_info.pNext = NULL;
5821 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5822 image_create_info.format = tex_format;
5823 image_create_info.extent.width = tex_width;
5824 image_create_info.extent.height = tex_height;
5825 image_create_info.extent.depth = 1;
5826 image_create_info.mipLevels = 1;
5827 image_create_info.arrayLayers = 1;
5828 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5829 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5830 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5831 image_create_info.flags = 0;
5832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5833 ASSERT_VK_SUCCESS(err);
5834 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5835 ASSERT_VK_SUCCESS(err);
5836
5837 VkMemoryRequirements memory_reqs;
5838 VkDeviceMemory image_memory;
5839 bool pass;
5840 VkMemoryAllocateInfo memory_info = {};
5841 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5842 memory_info.pNext = NULL;
5843 memory_info.allocationSize = 0;
5844 memory_info.memoryTypeIndex = 0;
5845 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5846 // Allocate enough memory for both images
5847 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005848 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005849 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005850 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005851 ASSERT_VK_SUCCESS(err);
5852 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5853 ASSERT_VK_SUCCESS(err);
5854 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005855 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005856 ASSERT_VK_SUCCESS(err);
5857
5858 VkImageViewCreateInfo image_view_create_info = {};
5859 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5860 image_view_create_info.image = image;
5861 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5862 image_view_create_info.format = tex_format;
5863 image_view_create_info.subresourceRange.layerCount = 1;
5864 image_view_create_info.subresourceRange.baseMipLevel = 0;
5865 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005866 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005867
5868 VkImageView view;
5869 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005870 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005871 ASSERT_VK_SUCCESS(err);
5872 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005873 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005874 ASSERT_VK_SUCCESS(err);
5875 // Create Samplers
5876 VkSamplerCreateInfo sampler_ci = {};
5877 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5878 sampler_ci.pNext = NULL;
5879 sampler_ci.magFilter = VK_FILTER_NEAREST;
5880 sampler_ci.minFilter = VK_FILTER_NEAREST;
5881 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5882 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5883 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5884 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5885 sampler_ci.mipLodBias = 1.0;
5886 sampler_ci.anisotropyEnable = VK_FALSE;
5887 sampler_ci.maxAnisotropy = 1;
5888 sampler_ci.compareEnable = VK_FALSE;
5889 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5890 sampler_ci.minLod = 1.0;
5891 sampler_ci.maxLod = 1.0;
5892 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5893 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5894 VkSampler sampler;
5895 VkSampler sampler2;
5896 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5897 ASSERT_VK_SUCCESS(err);
5898 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5899 ASSERT_VK_SUCCESS(err);
5900 // Update descriptor with image and sampler
5901 VkDescriptorImageInfo img_info = {};
5902 img_info.sampler = sampler;
5903 img_info.imageView = view;
5904 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5905
5906 VkWriteDescriptorSet descriptor_write;
5907 memset(&descriptor_write, 0, sizeof(descriptor_write));
5908 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5909 descriptor_write.dstSet = descriptorSet;
5910 descriptor_write.dstBinding = 0;
5911 descriptor_write.descriptorCount = 1;
5912 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5913 descriptor_write.pImageInfo = &img_info;
5914
5915 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5916
5917 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005918 char const *vsSource =
5919 "#version 450\n"
5920 "\n"
5921 "out gl_PerVertex { \n"
5922 " vec4 gl_Position;\n"
5923 "};\n"
5924 "void main(){\n"
5925 " gl_Position = vec4(1);\n"
5926 "}\n";
5927 char const *fsSource =
5928 "#version 450\n"
5929 "\n"
5930 "layout(set=0, binding=0) uniform sampler2D s;\n"
5931 "layout(location=0) out vec4 x;\n"
5932 "void main(){\n"
5933 " x = texture(s, vec2(1));\n"
5934 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005935 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5936 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5937 VkPipelineObj pipe(m_device);
5938 pipe.AddShader(&vs);
5939 pipe.AddShader(&fs);
5940 pipe.AddColorAttachment();
5941 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5942
5943 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005945 m_commandBuffer->BeginCommandBuffer();
5946 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005947 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5948 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5949 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005950 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5951 VkRect2D scissor = {{0, 0}, {16, 16}};
5952 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5953 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005954 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005955 m_commandBuffer->EndRenderPass();
5956 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005957 // Destroy sampler invalidates the cmd buffer, causing error on submit
5958 vkDestroySampler(m_device->device(), sampler, NULL);
5959 // Attempt to submit cmd buffer
5960 VkSubmitInfo submit_info = {};
5961 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5962 submit_info.commandBufferCount = 1;
5963 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5965 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005966
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005967 // Now re-update descriptor with valid sampler and delete image
5968 img_info.sampler = sampler2;
5969 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005970
5971 VkCommandBufferBeginInfo info = {};
5972 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5973 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5974
Mark Lobodzinski33826372017-04-13 11:10:11 -06005975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005976 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005977 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005978 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5979 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5980 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005981 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5982 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005983 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005984 m_commandBuffer->EndRenderPass();
5985 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005986 // Destroy image invalidates the cmd buffer, causing error on submit
5987 vkDestroyImage(m_device->device(), image, NULL);
5988 // Attempt to submit cmd buffer
5989 submit_info = {};
5990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5991 submit_info.commandBufferCount = 1;
5992 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5994 m_errorMonitor->VerifyFound();
5995 // Now update descriptor to be valid, but then free descriptor
5996 img_info.imageView = view2;
5997 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005998 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005999 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006000 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6001 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6002 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006003 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6004 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006005 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006006 m_commandBuffer->EndRenderPass();
6007 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006009
6010 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006012 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006013 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006014
6015 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006016 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006017 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006018 m_errorMonitor->SetUnexpectedError(
6019 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6020 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006021 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006022 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6023
6024 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 submit_info = {};
6026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6027 submit_info.commandBufferCount = 1;
6028 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006030 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6031 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006032
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006033 // Cleanup
6034 vkFreeMemory(m_device->device(), image_memory, NULL);
6035 vkDestroySampler(m_device->device(), sampler2, NULL);
6036 vkDestroyImage(m_device->device(), image2, NULL);
6037 vkDestroyImageView(m_device->device(), view, NULL);
6038 vkDestroyImageView(m_device->device(), view2, NULL);
6039 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6040 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6041 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6042}
6043
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006044TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6045 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6046 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6047 ASSERT_NO_FATAL_FAILURE(InitViewport());
6048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6049
6050 VkDescriptorPoolSize ds_type_count = {};
6051 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6052 ds_type_count.descriptorCount = 1;
6053
6054 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6055 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6056 ds_pool_ci.pNext = NULL;
6057 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6058 ds_pool_ci.maxSets = 1;
6059 ds_pool_ci.poolSizeCount = 1;
6060 ds_pool_ci.pPoolSizes = &ds_type_count;
6061
6062 VkDescriptorPool ds_pool;
6063 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6064 ASSERT_VK_SUCCESS(err);
6065
6066 VkDescriptorSetLayoutBinding dsl_binding = {};
6067 dsl_binding.binding = 0;
6068 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6069 dsl_binding.descriptorCount = 1;
6070 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6071 dsl_binding.pImmutableSamplers = NULL;
6072
6073 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6074 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6075 ds_layout_ci.pNext = NULL;
6076 ds_layout_ci.bindingCount = 1;
6077 ds_layout_ci.pBindings = &dsl_binding;
6078 VkDescriptorSetLayout ds_layout;
6079 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6080 ASSERT_VK_SUCCESS(err);
6081
6082 VkDescriptorSet descriptorSet;
6083 VkDescriptorSetAllocateInfo alloc_info = {};
6084 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6085 alloc_info.descriptorSetCount = 1;
6086 alloc_info.descriptorPool = ds_pool;
6087 alloc_info.pSetLayouts = &ds_layout;
6088 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6089 ASSERT_VK_SUCCESS(err);
6090
6091 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6092 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6093 pipeline_layout_ci.pNext = NULL;
6094 pipeline_layout_ci.setLayoutCount = 1;
6095 pipeline_layout_ci.pSetLayouts = &ds_layout;
6096
6097 VkPipelineLayout pipeline_layout;
6098 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6099 ASSERT_VK_SUCCESS(err);
6100
6101 // Create images to update the descriptor with
6102 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6103 VkImageObj image(m_device);
6104 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6105 0);
6106 ASSERT_TRUE(image.initialized());
6107
6108 VkImageViewCreateInfo image_view_create_info = {};
6109 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6110 image_view_create_info.image = image.handle();
6111 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6112 image_view_create_info.format = format;
6113 image_view_create_info.subresourceRange.layerCount = 1;
6114 image_view_create_info.subresourceRange.baseMipLevel = 0;
6115 image_view_create_info.subresourceRange.levelCount = 1;
6116 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6117
6118 VkImageView view;
6119 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6120 ASSERT_VK_SUCCESS(err);
6121 // Create Sampler
6122 VkSamplerCreateInfo sampler_ci = {};
6123 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6124 sampler_ci.pNext = NULL;
6125 sampler_ci.magFilter = VK_FILTER_NEAREST;
6126 sampler_ci.minFilter = VK_FILTER_NEAREST;
6127 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6128 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6129 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6130 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6131 sampler_ci.mipLodBias = 1.0;
6132 sampler_ci.anisotropyEnable = VK_FALSE;
6133 sampler_ci.maxAnisotropy = 1;
6134 sampler_ci.compareEnable = VK_FALSE;
6135 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6136 sampler_ci.minLod = 1.0;
6137 sampler_ci.maxLod = 1.0;
6138 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6139 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6140 VkSampler sampler;
6141 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6142 ASSERT_VK_SUCCESS(err);
6143 // Update descriptor with image and sampler
6144 VkDescriptorImageInfo img_info = {};
6145 img_info.sampler = sampler;
6146 img_info.imageView = view;
6147 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6148 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6149
6150 VkWriteDescriptorSet descriptor_write;
6151 memset(&descriptor_write, 0, sizeof(descriptor_write));
6152 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6153 descriptor_write.dstSet = descriptorSet;
6154 descriptor_write.dstBinding = 0;
6155 descriptor_write.descriptorCount = 1;
6156 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6157 descriptor_write.pImageInfo = &img_info;
6158
6159 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6160
6161 // Create PSO to be used for draw-time errors below
6162 char const *vsSource =
6163 "#version 450\n"
6164 "\n"
6165 "out gl_PerVertex { \n"
6166 " vec4 gl_Position;\n"
6167 "};\n"
6168 "void main(){\n"
6169 " gl_Position = vec4(1);\n"
6170 "}\n";
6171 char const *fsSource =
6172 "#version 450\n"
6173 "\n"
6174 "layout(set=0, binding=0) uniform sampler2D s;\n"
6175 "layout(location=0) out vec4 x;\n"
6176 "void main(){\n"
6177 " x = texture(s, vec2(1));\n"
6178 "}\n";
6179 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6180 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6181 VkPipelineObj pipe(m_device);
6182 pipe.AddShader(&vs);
6183 pipe.AddShader(&fs);
6184 pipe.AddColorAttachment();
6185 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6186
6187 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6188 cmd_buf.BeginCommandBuffer();
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006189 // record layout different than actual descriptor layout of SHADER_RO
6190 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski95512b72017-05-10 12:21:30 -06006191 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006192 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6193 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6194 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6195 VkRect2D scissor = {{0, 0}, {16, 16}};
6196 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6197 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6198 // At draw time the update layout will mis-match the actual layout
6199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6200 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6201 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6202 m_errorMonitor->SetDesiredFailureMsg(
6203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6204 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6205 cmd_buf.Draw(1, 0, 0, 0);
6206 m_errorMonitor->VerifyFound();
6207 cmd_buf.EndRenderPass();
6208 cmd_buf.EndCommandBuffer();
6209 // Submit cmd buffer
6210 VkSubmitInfo submit_info = {};
6211 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6212 submit_info.commandBufferCount = 1;
6213 submit_info.pCommandBuffers = &cmd_buf.handle();
6214 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6215 vkQueueWaitIdle(m_device->m_queue);
6216 // Cleanup
6217 vkDestroySampler(m_device->device(), sampler, NULL);
6218 vkDestroyImageView(m_device->device(), view, NULL);
6219 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6220 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6221 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6222}
6223
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006224TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6225 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006226 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006227 ASSERT_NO_FATAL_FAILURE(InitViewport());
6228 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6229
6230 VkDescriptorPoolSize ds_type_count = {};
6231 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6232 ds_type_count.descriptorCount = 1;
6233
6234 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6235 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6236 ds_pool_ci.pNext = NULL;
6237 ds_pool_ci.maxSets = 1;
6238 ds_pool_ci.poolSizeCount = 1;
6239 ds_pool_ci.pPoolSizes = &ds_type_count;
6240
6241 VkDescriptorPool ds_pool;
6242 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6243 ASSERT_VK_SUCCESS(err);
6244
6245 VkDescriptorSetLayoutBinding dsl_binding = {};
6246 dsl_binding.binding = 0;
6247 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6248 dsl_binding.descriptorCount = 1;
6249 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6250 dsl_binding.pImmutableSamplers = NULL;
6251
6252 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6253 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6254 ds_layout_ci.pNext = NULL;
6255 ds_layout_ci.bindingCount = 1;
6256 ds_layout_ci.pBindings = &dsl_binding;
6257 VkDescriptorSetLayout ds_layout;
6258 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6259 ASSERT_VK_SUCCESS(err);
6260
6261 VkDescriptorSet descriptor_set;
6262 VkDescriptorSetAllocateInfo alloc_info = {};
6263 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6264 alloc_info.descriptorSetCount = 1;
6265 alloc_info.descriptorPool = ds_pool;
6266 alloc_info.pSetLayouts = &ds_layout;
6267 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6268 ASSERT_VK_SUCCESS(err);
6269
6270 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6271 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6272 pipeline_layout_ci.pNext = NULL;
6273 pipeline_layout_ci.setLayoutCount = 1;
6274 pipeline_layout_ci.pSetLayouts = &ds_layout;
6275
6276 VkPipelineLayout pipeline_layout;
6277 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6278 ASSERT_VK_SUCCESS(err);
6279
6280 // Create image to update the descriptor with
6281 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006282 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006283 ASSERT_TRUE(image.initialized());
6284
6285 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6286 // Create Sampler
6287 VkSamplerCreateInfo sampler_ci = {};
6288 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6289 sampler_ci.pNext = NULL;
6290 sampler_ci.magFilter = VK_FILTER_NEAREST;
6291 sampler_ci.minFilter = VK_FILTER_NEAREST;
6292 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6293 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6294 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6295 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6296 sampler_ci.mipLodBias = 1.0;
6297 sampler_ci.anisotropyEnable = VK_FALSE;
6298 sampler_ci.maxAnisotropy = 1;
6299 sampler_ci.compareEnable = VK_FALSE;
6300 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6301 sampler_ci.minLod = 1.0;
6302 sampler_ci.maxLod = 1.0;
6303 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6304 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6305 VkSampler sampler;
6306 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6307 ASSERT_VK_SUCCESS(err);
6308 // Update descriptor with image and sampler
6309 VkDescriptorImageInfo img_info = {};
6310 img_info.sampler = sampler;
6311 img_info.imageView = view;
6312 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6313
6314 VkWriteDescriptorSet descriptor_write;
6315 memset(&descriptor_write, 0, sizeof(descriptor_write));
6316 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6317 descriptor_write.dstSet = descriptor_set;
6318 descriptor_write.dstBinding = 0;
6319 descriptor_write.descriptorCount = 1;
6320 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6321 descriptor_write.pImageInfo = &img_info;
6322
6323 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6324
6325 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006326 char const *vsSource =
6327 "#version 450\n"
6328 "\n"
6329 "out gl_PerVertex { \n"
6330 " vec4 gl_Position;\n"
6331 "};\n"
6332 "void main(){\n"
6333 " gl_Position = vec4(1);\n"
6334 "}\n";
6335 char const *fsSource =
6336 "#version 450\n"
6337 "\n"
6338 "layout(set=0, binding=0) uniform sampler2D s;\n"
6339 "layout(location=0) out vec4 x;\n"
6340 "void main(){\n"
6341 " x = texture(s, vec2(1));\n"
6342 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006343 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6344 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6345 VkPipelineObj pipe(m_device);
6346 pipe.AddShader(&vs);
6347 pipe.AddShader(&fs);
6348 pipe.AddColorAttachment();
6349 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6350
Tony Barbour552f6c02016-12-21 14:34:07 -07006351 m_commandBuffer->BeginCommandBuffer();
6352 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006353 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6354 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6355 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006356
6357 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6358 VkRect2D scissor = {{0, 0}, {16, 16}};
6359 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6360 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6361
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006362 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006363 m_commandBuffer->EndRenderPass();
6364 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006365 // Submit cmd buffer to put pool in-flight
6366 VkSubmitInfo submit_info = {};
6367 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6368 submit_info.commandBufferCount = 1;
6369 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6370 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6371 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006373 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6374 m_errorMonitor->VerifyFound();
6375 vkQueueWaitIdle(m_device->m_queue);
6376 // Cleanup
6377 vkDestroySampler(m_device->device(), sampler, NULL);
6378 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006380 m_errorMonitor->SetUnexpectedError(
6381 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006382 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006383 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006384 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006385}
6386
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006387TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6388 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006389 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006390 ASSERT_NO_FATAL_FAILURE(InitViewport());
6391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6392
6393 VkDescriptorPoolSize ds_type_count = {};
6394 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6395 ds_type_count.descriptorCount = 1;
6396
6397 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6398 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6399 ds_pool_ci.pNext = NULL;
6400 ds_pool_ci.maxSets = 1;
6401 ds_pool_ci.poolSizeCount = 1;
6402 ds_pool_ci.pPoolSizes = &ds_type_count;
6403
6404 VkDescriptorPool ds_pool;
6405 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6406 ASSERT_VK_SUCCESS(err);
6407
6408 VkDescriptorSetLayoutBinding dsl_binding = {};
6409 dsl_binding.binding = 0;
6410 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6411 dsl_binding.descriptorCount = 1;
6412 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6413 dsl_binding.pImmutableSamplers = NULL;
6414
6415 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6416 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6417 ds_layout_ci.pNext = NULL;
6418 ds_layout_ci.bindingCount = 1;
6419 ds_layout_ci.pBindings = &dsl_binding;
6420 VkDescriptorSetLayout ds_layout;
6421 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6422 ASSERT_VK_SUCCESS(err);
6423
6424 VkDescriptorSet descriptorSet;
6425 VkDescriptorSetAllocateInfo alloc_info = {};
6426 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6427 alloc_info.descriptorSetCount = 1;
6428 alloc_info.descriptorPool = ds_pool;
6429 alloc_info.pSetLayouts = &ds_layout;
6430 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6431 ASSERT_VK_SUCCESS(err);
6432
6433 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6434 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6435 pipeline_layout_ci.pNext = NULL;
6436 pipeline_layout_ci.setLayoutCount = 1;
6437 pipeline_layout_ci.pSetLayouts = &ds_layout;
6438
6439 VkPipelineLayout pipeline_layout;
6440 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6441 ASSERT_VK_SUCCESS(err);
6442
6443 // Create images to update the descriptor with
6444 VkImage image;
6445 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6446 const int32_t tex_width = 32;
6447 const int32_t tex_height = 32;
6448 VkImageCreateInfo image_create_info = {};
6449 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6450 image_create_info.pNext = NULL;
6451 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6452 image_create_info.format = tex_format;
6453 image_create_info.extent.width = tex_width;
6454 image_create_info.extent.height = tex_height;
6455 image_create_info.extent.depth = 1;
6456 image_create_info.mipLevels = 1;
6457 image_create_info.arrayLayers = 1;
6458 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6459 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6460 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6461 image_create_info.flags = 0;
6462 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6463 ASSERT_VK_SUCCESS(err);
6464 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6465 VkMemoryRequirements memory_reqs;
6466 VkDeviceMemory image_memory;
6467 bool pass;
6468 VkMemoryAllocateInfo memory_info = {};
6469 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6470 memory_info.pNext = NULL;
6471 memory_info.allocationSize = 0;
6472 memory_info.memoryTypeIndex = 0;
6473 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6474 // Allocate enough memory for image
6475 memory_info.allocationSize = memory_reqs.size;
6476 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6477 ASSERT_TRUE(pass);
6478 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6479 ASSERT_VK_SUCCESS(err);
6480 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6481 ASSERT_VK_SUCCESS(err);
6482
6483 VkImageViewCreateInfo image_view_create_info = {};
6484 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6485 image_view_create_info.image = image;
6486 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6487 image_view_create_info.format = tex_format;
6488 image_view_create_info.subresourceRange.layerCount = 1;
6489 image_view_create_info.subresourceRange.baseMipLevel = 0;
6490 image_view_create_info.subresourceRange.levelCount = 1;
6491 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6492
6493 VkImageView view;
6494 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6495 ASSERT_VK_SUCCESS(err);
6496 // Create Samplers
6497 VkSamplerCreateInfo sampler_ci = {};
6498 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6499 sampler_ci.pNext = NULL;
6500 sampler_ci.magFilter = VK_FILTER_NEAREST;
6501 sampler_ci.minFilter = VK_FILTER_NEAREST;
6502 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6503 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6504 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6505 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6506 sampler_ci.mipLodBias = 1.0;
6507 sampler_ci.anisotropyEnable = VK_FALSE;
6508 sampler_ci.maxAnisotropy = 1;
6509 sampler_ci.compareEnable = VK_FALSE;
6510 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6511 sampler_ci.minLod = 1.0;
6512 sampler_ci.maxLod = 1.0;
6513 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6514 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6515 VkSampler sampler;
6516 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6517 ASSERT_VK_SUCCESS(err);
6518 // Update descriptor with image and sampler
6519 VkDescriptorImageInfo img_info = {};
6520 img_info.sampler = sampler;
6521 img_info.imageView = view;
6522 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6523
6524 VkWriteDescriptorSet descriptor_write;
6525 memset(&descriptor_write, 0, sizeof(descriptor_write));
6526 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6527 descriptor_write.dstSet = descriptorSet;
6528 descriptor_write.dstBinding = 0;
6529 descriptor_write.descriptorCount = 1;
6530 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6531 descriptor_write.pImageInfo = &img_info;
6532 // Break memory binding and attempt update
6533 vkFreeMemory(m_device->device(), image_memory, nullptr);
6534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006535 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6537 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6538 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6539 m_errorMonitor->VerifyFound();
6540 // Cleanup
6541 vkDestroyImage(m_device->device(), image, NULL);
6542 vkDestroySampler(m_device->device(), sampler, NULL);
6543 vkDestroyImageView(m_device->device(), view, NULL);
6544 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6545 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6546 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6547}
6548
Karl Schultz6addd812016-02-02 17:17:23 -07006549TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006550 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6551 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006552 // Create a valid cmd buffer
6553 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006554 uint64_t fake_pipeline_handle = 0xbaad6001;
6555 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006556 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6558
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006560 m_commandBuffer->BeginCommandBuffer();
6561 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006562 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006563 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006564
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006565 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006567 Draw(1, 0, 0, 0);
6568 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006569
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006570 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006572 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006573 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6574 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006575}
6576
Karl Schultz6addd812016-02-02 17:17:23 -07006577TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006578 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006579 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006582
Tony Barbour1fa09702017-03-16 12:09:08 -06006583 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006584 ASSERT_NO_FATAL_FAILURE(InitViewport());
6585 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006586 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006587 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6588 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006589
6590 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006591 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6592 ds_pool_ci.pNext = NULL;
6593 ds_pool_ci.maxSets = 1;
6594 ds_pool_ci.poolSizeCount = 1;
6595 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006596
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006597 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006598 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006599 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006600
Tony Barboureb254902015-07-15 12:50:33 -06006601 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006602 dsl_binding.binding = 0;
6603 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6604 dsl_binding.descriptorCount = 1;
6605 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6606 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006607
Tony Barboureb254902015-07-15 12:50:33 -06006608 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006609 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6610 ds_layout_ci.pNext = NULL;
6611 ds_layout_ci.bindingCount = 1;
6612 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006613 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006614 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006615 ASSERT_VK_SUCCESS(err);
6616
6617 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006618 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006619 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006620 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006621 alloc_info.descriptorPool = ds_pool;
6622 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006623 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006624 ASSERT_VK_SUCCESS(err);
6625
Tony Barboureb254902015-07-15 12:50:33 -06006626 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6628 pipeline_layout_ci.pNext = NULL;
6629 pipeline_layout_ci.setLayoutCount = 1;
6630 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006631
6632 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006633 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006634 ASSERT_VK_SUCCESS(err);
6635
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006636 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006637 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006638 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006639 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006640
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006641 VkPipelineObj pipe(m_device);
6642 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006643 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006644 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006645 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006646
Tony Barbour552f6c02016-12-21 14:34:07 -07006647 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006648 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6649 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6650 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006651
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006652 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006653
Chia-I Wuf7458c52015-10-26 21:10:41 +08006654 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6655 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6656 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006657}
6658
Karl Schultz6addd812016-02-02 17:17:23 -07006659TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006660 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006661 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006662
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006664
Tony Barbour1fa09702017-03-16 12:09:08 -06006665 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006666 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006667 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6668 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006669
6670 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006671 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6672 ds_pool_ci.pNext = NULL;
6673 ds_pool_ci.maxSets = 1;
6674 ds_pool_ci.poolSizeCount = 1;
6675 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006676
6677 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006678 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006679 ASSERT_VK_SUCCESS(err);
6680
6681 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006682 dsl_binding.binding = 0;
6683 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6684 dsl_binding.descriptorCount = 1;
6685 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6686 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006687
6688 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006689 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6690 ds_layout_ci.pNext = NULL;
6691 ds_layout_ci.bindingCount = 1;
6692 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006693 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006694 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006695 ASSERT_VK_SUCCESS(err);
6696
6697 VkDescriptorSet descriptorSet;
6698 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006699 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006700 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006701 alloc_info.descriptorPool = ds_pool;
6702 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006703 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006704 ASSERT_VK_SUCCESS(err);
6705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006706 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006707 VkWriteDescriptorSet descriptor_write;
6708 memset(&descriptor_write, 0, sizeof(descriptor_write));
6709 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6710 descriptor_write.dstSet = descriptorSet;
6711 descriptor_write.dstBinding = 0;
6712 descriptor_write.descriptorCount = 1;
6713 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6714 descriptor_write.pTexelBufferView = &view;
6715
6716 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6717
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006718 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006719
6720 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6721 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6722}
6723
Mark Youngd339ba32016-05-30 13:28:35 -06006724TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006725 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006726
6727 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006729 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006730
Tony Barbour1fa09702017-03-16 12:09:08 -06006731 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006732
6733 // Create a buffer with no bound memory and then attempt to create
6734 // a buffer view.
6735 VkBufferCreateInfo buff_ci = {};
6736 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006737 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006738 buff_ci.size = 256;
6739 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6740 VkBuffer buffer;
6741 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6742 ASSERT_VK_SUCCESS(err);
6743
6744 VkBufferViewCreateInfo buff_view_ci = {};
6745 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6746 buff_view_ci.buffer = buffer;
6747 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6748 buff_view_ci.range = VK_WHOLE_SIZE;
6749 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006750 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006751
6752 m_errorMonitor->VerifyFound();
6753 vkDestroyBuffer(m_device->device(), buffer, NULL);
6754 // If last error is success, it still created the view, so delete it.
6755 if (err == VK_SUCCESS) {
6756 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6757 }
6758}
6759
Karl Schultz6addd812016-02-02 17:17:23 -07006760TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6761 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6762 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006763 // 1. No dynamicOffset supplied
6764 // 2. Too many dynamicOffsets supplied
6765 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006766 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6768 " requires 1 dynamicOffsets, but only "
6769 "0 dynamicOffsets are left in "
6770 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006771
Tony Barbour1fa09702017-03-16 12:09:08 -06006772 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006773 ASSERT_NO_FATAL_FAILURE(InitViewport());
6774 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6775
6776 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006777 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6778 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006779
6780 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006781 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6782 ds_pool_ci.pNext = NULL;
6783 ds_pool_ci.maxSets = 1;
6784 ds_pool_ci.poolSizeCount = 1;
6785 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006786
6787 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006788 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006789 ASSERT_VK_SUCCESS(err);
6790
6791 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006792 dsl_binding.binding = 0;
6793 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6794 dsl_binding.descriptorCount = 1;
6795 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6796 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006797
6798 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006799 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6800 ds_layout_ci.pNext = NULL;
6801 ds_layout_ci.bindingCount = 1;
6802 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006803 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006804 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006805 ASSERT_VK_SUCCESS(err);
6806
6807 VkDescriptorSet descriptorSet;
6808 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006809 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006810 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006811 alloc_info.descriptorPool = ds_pool;
6812 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006813 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006814 ASSERT_VK_SUCCESS(err);
6815
6816 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006817 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6818 pipeline_layout_ci.pNext = NULL;
6819 pipeline_layout_ci.setLayoutCount = 1;
6820 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006821
6822 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006823 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006824 ASSERT_VK_SUCCESS(err);
6825
6826 // Create a buffer to update the descriptor with
6827 uint32_t qfi = 0;
6828 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006829 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6830 buffCI.size = 1024;
6831 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6832 buffCI.queueFamilyIndexCount = 1;
6833 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006834
6835 VkBuffer dyub;
6836 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6837 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006838 // Allocate memory and bind to buffer so we can make it to the appropriate
6839 // error
6840 VkMemoryAllocateInfo mem_alloc = {};
6841 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6842 mem_alloc.pNext = NULL;
6843 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006844 mem_alloc.memoryTypeIndex = 0;
6845
6846 VkMemoryRequirements memReqs;
6847 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006848 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006849 if (!pass) {
6850 vkDestroyBuffer(m_device->device(), dyub, NULL);
6851 return;
6852 }
6853
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006854 VkDeviceMemory mem;
6855 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6856 ASSERT_VK_SUCCESS(err);
6857 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6858 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006859 // Correctly update descriptor to avoid "NOT_UPDATED" error
6860 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006861 buffInfo.buffer = dyub;
6862 buffInfo.offset = 0;
6863 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006864
6865 VkWriteDescriptorSet descriptor_write;
6866 memset(&descriptor_write, 0, sizeof(descriptor_write));
6867 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6868 descriptor_write.dstSet = descriptorSet;
6869 descriptor_write.dstBinding = 0;
6870 descriptor_write.descriptorCount = 1;
6871 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6872 descriptor_write.pBufferInfo = &buffInfo;
6873
6874 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6875
Tony Barbour552f6c02016-12-21 14:34:07 -07006876 m_commandBuffer->BeginCommandBuffer();
6877 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006878 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6879 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006880 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006881 uint32_t pDynOff[2] = {512, 756};
6882 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6884 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6885 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6886 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006887 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006888 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6890 " dynamic offset 512 combined with "
6891 "offset 0 and range 1024 that "
6892 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006893 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006894 char const *vsSource =
6895 "#version 450\n"
6896 "\n"
6897 "out gl_PerVertex { \n"
6898 " vec4 gl_Position;\n"
6899 "};\n"
6900 "void main(){\n"
6901 " gl_Position = vec4(1);\n"
6902 "}\n";
6903 char const *fsSource =
6904 "#version 450\n"
6905 "\n"
6906 "layout(location=0) out vec4 x;\n"
6907 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6908 "void main(){\n"
6909 " x = vec4(bar.y);\n"
6910 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006911 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6912 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6913 VkPipelineObj pipe(m_device);
6914 pipe.AddShader(&vs);
6915 pipe.AddShader(&fs);
6916 pipe.AddColorAttachment();
6917 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6918
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006919 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6920 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6921 VkRect2D scissor = {{0, 0}, {16, 16}};
6922 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6923
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006924 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006925 // This update should succeed, but offset size of 512 will overstep buffer
6926 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006927 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6928 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006929 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006930 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006931
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006932 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006933 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006934
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006935 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006936 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006937 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6938}
6939
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006940TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006941 TEST_DESCRIPTION(
6942 "Attempt to update a descriptor with a non-sparse buffer "
6943 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006944 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006946 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6948 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006949
Tony Barbour1fa09702017-03-16 12:09:08 -06006950 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006951 ASSERT_NO_FATAL_FAILURE(InitViewport());
6952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6953
6954 VkDescriptorPoolSize ds_type_count = {};
6955 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6956 ds_type_count.descriptorCount = 1;
6957
6958 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6959 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6960 ds_pool_ci.pNext = NULL;
6961 ds_pool_ci.maxSets = 1;
6962 ds_pool_ci.poolSizeCount = 1;
6963 ds_pool_ci.pPoolSizes = &ds_type_count;
6964
6965 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006966 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006967 ASSERT_VK_SUCCESS(err);
6968
6969 VkDescriptorSetLayoutBinding dsl_binding = {};
6970 dsl_binding.binding = 0;
6971 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6972 dsl_binding.descriptorCount = 1;
6973 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6974 dsl_binding.pImmutableSamplers = NULL;
6975
6976 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6977 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6978 ds_layout_ci.pNext = NULL;
6979 ds_layout_ci.bindingCount = 1;
6980 ds_layout_ci.pBindings = &dsl_binding;
6981 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006982 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006983 ASSERT_VK_SUCCESS(err);
6984
6985 VkDescriptorSet descriptorSet;
6986 VkDescriptorSetAllocateInfo alloc_info = {};
6987 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6988 alloc_info.descriptorSetCount = 1;
6989 alloc_info.descriptorPool = ds_pool;
6990 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006991 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006992 ASSERT_VK_SUCCESS(err);
6993
6994 // Create a buffer to update the descriptor with
6995 uint32_t qfi = 0;
6996 VkBufferCreateInfo buffCI = {};
6997 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6998 buffCI.size = 1024;
6999 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7000 buffCI.queueFamilyIndexCount = 1;
7001 buffCI.pQueueFamilyIndices = &qfi;
7002
7003 VkBuffer dyub;
7004 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7005 ASSERT_VK_SUCCESS(err);
7006
7007 // Attempt to update descriptor without binding memory to it
7008 VkDescriptorBufferInfo buffInfo = {};
7009 buffInfo.buffer = dyub;
7010 buffInfo.offset = 0;
7011 buffInfo.range = 1024;
7012
7013 VkWriteDescriptorSet descriptor_write;
7014 memset(&descriptor_write, 0, sizeof(descriptor_write));
7015 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7016 descriptor_write.dstSet = descriptorSet;
7017 descriptor_write.dstBinding = 0;
7018 descriptor_write.descriptorCount = 1;
7019 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7020 descriptor_write.pBufferInfo = &buffInfo;
7021
7022 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7023 m_errorMonitor->VerifyFound();
7024
7025 vkDestroyBuffer(m_device->device(), dyub, NULL);
7026 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7027 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7028}
7029
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007030TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007031 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007032 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007033 ASSERT_NO_FATAL_FAILURE(InitViewport());
7034 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7035
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007036 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007037 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007038 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7039 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7040 pipeline_layout_ci.pushConstantRangeCount = 1;
7041 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7042
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007043 //
7044 // Check for invalid push constant ranges in pipeline layouts.
7045 //
7046 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007047 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007048 char const *msg;
7049 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007050
Karl Schultzc81037d2016-05-12 08:11:23 -06007051 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7052 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7053 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7054 "vkCreatePipelineLayout() call has push constants index 0 with "
7055 "size 0."},
7056 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7057 "vkCreatePipelineLayout() call has push constants index 0 with "
7058 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007059 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007060 "vkCreatePipelineLayout() call has push constants index 0 with "
7061 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007062 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007063 "vkCreatePipelineLayout() call has push constants index 0 with "
7064 "size 0."},
7065 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7066 "vkCreatePipelineLayout() call has push constants index 0 with "
7067 "offset 1. Offset must"},
7068 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7069 "vkCreatePipelineLayout() call has push constants index 0 "
7070 "with offset "},
7071 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7072 "vkCreatePipelineLayout() call has push constants "
7073 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007074 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007075 "vkCreatePipelineLayout() call has push constants index 0 "
7076 "with offset "},
7077 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7078 "vkCreatePipelineLayout() call has push "
7079 "constants index 0 with offset "},
7080 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7081 "vkCreatePipelineLayout() call has push "
7082 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007083 }};
7084
7085 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007086 for (const auto &iter : range_tests) {
7087 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7089 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007090 m_errorMonitor->VerifyFound();
7091 if (VK_SUCCESS == err) {
7092 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7093 }
7094 }
7095
7096 // Check for invalid stage flag
7097 pc_range.offset = 0;
7098 pc_range.size = 16;
7099 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007100 m_errorMonitor->SetDesiredFailureMsg(
7101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7102 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007103 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007104 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007105 if (VK_SUCCESS == err) {
7106 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7107 }
7108
Karl Schultzc59b72d2017-02-24 15:45:05 -07007109 // Check for duplicate stage flags in a list of push constant ranges.
7110 // A shader can only have one push constant block and that block is mapped
7111 // to the push constant range that has that shader's stage flag set.
7112 // The shader's stage flag can only appear once in all the ranges, so the
7113 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007114 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007115 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007116 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007117 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007118 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007119 // Overlapping ranges are OK, but a stage flag can appear only once.
7120 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7121 {
7122 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7123 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7124 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7125 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007126 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007127 {
7128 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7129 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7130 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7131 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7132 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7133 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7134 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7135 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7136 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7137 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7138 }},
7139 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7140 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7141 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7142 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7143 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7144 {
7145 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7146 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7147 }},
7148 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7149 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7150 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7151 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7152 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7153 {
7154 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7155 }},
7156 },
7157 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007158
Karl Schultzc59b72d2017-02-24 15:45:05 -07007159 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007160 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007161 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007163 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007164 m_errorMonitor->VerifyFound();
7165 if (VK_SUCCESS == err) {
7166 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7167 }
7168 }
7169
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007170 //
7171 // CmdPushConstants tests
7172 //
7173
Karl Schultzc59b72d2017-02-24 15:45:05 -07007174 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007175 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007176 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007177 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007178 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007179 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007181 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007182
7183 const uint8_t dummy_values[100] = {};
7184
7185 m_commandBuffer->BeginCommandBuffer();
7186 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007187
7188 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007189 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007191 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007192 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007193
Karl Schultzc59b72d2017-02-24 15:45:05 -07007194 m_errorMonitor->ExpectSuccess();
7195 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7196 m_errorMonitor->VerifyNotFound();
7197 m_errorMonitor->ExpectSuccess();
7198 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7199 m_errorMonitor->VerifyNotFound();
7200 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7201 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7202 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7203 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7204 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7205 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7206 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007207 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007208 for (const auto &iter : cmd_range_tests) {
7209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7210 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7211 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007212 m_errorMonitor->VerifyFound();
7213 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007214
Tony Barbour552f6c02016-12-21 14:34:07 -07007215 m_commandBuffer->EndRenderPass();
7216 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007217 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007218}
7219
Karl Schultz6addd812016-02-02 17:17:23 -07007220TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007221 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007222 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007223
Tony Barbour1fa09702017-03-16 12:09:08 -06007224 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007225 ASSERT_NO_FATAL_FAILURE(InitViewport());
7226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7227
7228 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7229 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007230 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7231 ds_type_count[0].descriptorCount = 10;
7232 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7233 ds_type_count[1].descriptorCount = 2;
7234 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7235 ds_type_count[2].descriptorCount = 2;
7236 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7237 ds_type_count[3].descriptorCount = 5;
7238 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7239 // type
7240 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7241 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7242 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007243
7244 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007245 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7246 ds_pool_ci.pNext = NULL;
7247 ds_pool_ci.maxSets = 5;
7248 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7249 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007250
7251 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007252 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007253 ASSERT_VK_SUCCESS(err);
7254
7255 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7256 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007257 dsl_binding[0].binding = 0;
7258 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7259 dsl_binding[0].descriptorCount = 5;
7260 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7261 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007262
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007263 // Create layout identical to set0 layout but w/ different stageFlags
7264 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007265 dsl_fs_stage_only.binding = 0;
7266 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7267 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007268 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7269 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007270 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007271 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007272 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7273 ds_layout_ci.pNext = NULL;
7274 ds_layout_ci.bindingCount = 1;
7275 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007276 static const uint32_t NUM_LAYOUTS = 4;
7277 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007278 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007279 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7280 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007281 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007282 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007283 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007284 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007285 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007286 dsl_binding[0].binding = 0;
7287 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007288 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007289 dsl_binding[1].binding = 1;
7290 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7291 dsl_binding[1].descriptorCount = 2;
7292 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7293 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007294 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007295 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007296 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007297 ASSERT_VK_SUCCESS(err);
7298 dsl_binding[0].binding = 0;
7299 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007300 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007301 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007302 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007303 ASSERT_VK_SUCCESS(err);
7304 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007305 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007306 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007307 ASSERT_VK_SUCCESS(err);
7308
7309 static const uint32_t NUM_SETS = 4;
7310 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7311 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007312 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007313 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007314 alloc_info.descriptorPool = ds_pool;
7315 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007316 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007317 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007318 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007319 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007320 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007321 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007322 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007323
7324 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007325 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7326 pipeline_layout_ci.pNext = NULL;
7327 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7328 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007329
7330 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007331 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007332 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007333 // Create pipelineLayout with only one setLayout
7334 pipeline_layout_ci.setLayoutCount = 1;
7335 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007336 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007337 ASSERT_VK_SUCCESS(err);
7338 // Create pipelineLayout with 2 descriptor setLayout at index 0
7339 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7340 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007341 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007342 ASSERT_VK_SUCCESS(err);
7343 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7344 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7345 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007346 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007347 ASSERT_VK_SUCCESS(err);
7348 // Create pipelineLayout with UB type, but stageFlags for FS only
7349 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7350 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007351 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007352 ASSERT_VK_SUCCESS(err);
7353 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7354 VkDescriptorSetLayout pl_bad_s0[2] = {};
7355 pl_bad_s0[0] = ds_layout_fs_only;
7356 pl_bad_s0[1] = ds_layout[1];
7357 pipeline_layout_ci.setLayoutCount = 2;
7358 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7359 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007360 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007361 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007362
Tobin Ehlis88452832015-12-03 09:40:56 -07007363 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007364 char const *vsSource =
7365 "#version 450\n"
7366 "\n"
7367 "out gl_PerVertex {\n"
7368 " vec4 gl_Position;\n"
7369 "};\n"
7370 "void main(){\n"
7371 " gl_Position = vec4(1);\n"
7372 "}\n";
7373 char const *fsSource =
7374 "#version 450\n"
7375 "\n"
7376 "layout(location=0) out vec4 x;\n"
7377 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7378 "void main(){\n"
7379 " x = vec4(bar.y);\n"
7380 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007381 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7382 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007383 VkPipelineObj pipe(m_device);
7384 pipe.AddShader(&vs);
7385 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007386 pipe.AddColorAttachment();
7387 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007388
Tony Barbour552f6c02016-12-21 14:34:07 -07007389 m_commandBuffer->BeginCommandBuffer();
7390 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007391
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007392 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007393 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7394 // of PSO
7395 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7396 // cmd_pipeline.c
7397 // due to the fact that cmd_alloc_dset_data() has not been called in
7398 // cmd_bind_graphics_pipeline()
7399 // TODO : Want to cause various binding incompatibility issues here to test
7400 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007401 // First cause various verify_layout_compatibility() fails
7402 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007403 // verify_set_layout_compatibility fail cases:
7404 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007406 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7407 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007408 m_errorMonitor->VerifyFound();
7409
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007410 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7412 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7413 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007414 m_errorMonitor->VerifyFound();
7415
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007416 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007417 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7418 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7420 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7421 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007422 m_errorMonitor->VerifyFound();
7423
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007424 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7425 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7427 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7428 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007429 m_errorMonitor->VerifyFound();
7430
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007431 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7432 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7434 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7435 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7436 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007437 m_errorMonitor->VerifyFound();
7438
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007439 // Cause INFO messages due to disturbing previously bound Sets
7440 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007441 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7442 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007443 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7445 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7446 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007447 m_errorMonitor->VerifyFound();
7448
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007449 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7450 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007451 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7453 " newly bound as set #0 so set #1 and "
7454 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007455 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7456 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007457 m_errorMonitor->VerifyFound();
7458
Tobin Ehlis10fad692016-07-07 12:00:36 -06007459 // Now that we're done actively using the pipelineLayout that gfx pipeline
7460 // was created with, we should be able to delete it. Do that now to verify
7461 // that validation obeys pipelineLayout lifetime
7462 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7463
Tobin Ehlis88452832015-12-03 09:40:56 -07007464 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007465 // 1. Error due to not binding required set (we actually use same code as
7466 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007467 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7468 &descriptorSet[0], 0, NULL);
7469 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7470 &descriptorSet[1], 0, NULL);
7471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007472
7473 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7474 VkRect2D scissor = {{0, 0}, {16, 16}};
7475 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7476 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7477
Tobin Ehlis88452832015-12-03 09:40:56 -07007478 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007479 m_errorMonitor->VerifyFound();
7480
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007481 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007482 // 2. Error due to bound set not being compatible with PSO's
7483 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007484 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7485 &descriptorSet[0], 0, NULL);
7486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007487 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007488 m_errorMonitor->VerifyFound();
7489
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007490 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007491 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007492 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7493 }
7494 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007495 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7496 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7497}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007498
Karl Schultz6addd812016-02-02 17:17:23 -07007499TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7501 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007502
Tony Barbour1fa09702017-03-16 12:09:08 -06007503 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007504 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007505 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007506 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007508 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007509}
7510
Karl Schultz6addd812016-02-02 17:17:23 -07007511TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7512 VkResult err;
7513 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007514
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007516
Tony Barbour1fa09702017-03-16 12:09:08 -06007517 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007518
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007519 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007520 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007521 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007522 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007523 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007524 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007525
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007526 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007527 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007528
7529 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007530 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007531 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7532
7533 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007534 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007535 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007536 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007537 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007538
7539 // The error should be caught by validation of the BeginCommandBuffer call
7540 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007542 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007543 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007544}
7545
Chris Forbes5b3725e2017-05-18 16:01:20 -07007546TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
Chris Forbes9480ae92017-05-17 17:14:34 -07007547 ASSERT_NO_FATAL_FAILURE(Init());
7548
Chris Forbes5b3725e2017-05-18 16:01:20 -07007549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was destroyed or rerecorded");
Chris Forbes9480ae92017-05-17 17:14:34 -07007550
7551 // A pool we can reset in.
7552 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_,
7553 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
7554 VkCommandBufferObj secondary(m_device, &pool,
7555 VK_COMMAND_BUFFER_LEVEL_SECONDARY);
7556
7557 secondary.begin();
7558 secondary.end();
7559
7560 m_commandBuffer->begin();
7561 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
7562
7563 // rerecording of secondary
Chris Forbes5b3725e2017-05-18 16:01:20 -07007564 secondary.reset(); // explicit reset here.
Chris Forbes9480ae92017-05-17 17:14:34 -07007565 secondary.begin();
7566 secondary.end();
7567
7568 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Chris Forbes5b3725e2017-05-18 16:01:20 -07007569 m_errorMonitor->VerifyFound();
7570}
Chris Forbes9480ae92017-05-17 17:14:34 -07007571
Chris Forbes5b3725e2017-05-18 16:01:20 -07007572TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
7573 ASSERT_NO_FATAL_FAILURE(Init());
7574
7575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was destroyed or rerecorded");
7576
7577 // A pool we can reset in.
7578 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_,
7579 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
7580 VkCommandBufferObj secondary(m_device, &pool,
7581 VK_COMMAND_BUFFER_LEVEL_SECONDARY);
7582
7583 secondary.begin();
7584 secondary.end();
7585
7586 m_commandBuffer->begin();
7587 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
7588
7589 // rerecording of secondary
7590 secondary.begin(); // implicit reset in begin
7591 secondary.end();
7592
7593 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Chris Forbes9480ae92017-05-17 17:14:34 -07007594 m_errorMonitor->VerifyFound();
7595}
7596
Chris Forbes42bbfe22017-05-18 16:20:53 -07007597TEST_F(VkLayerTest, CascadedInvalidation) {
7598 ASSERT_NO_FATAL_FAILURE(Init());
7599
7600 VkEventCreateInfo eci = { VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, nullptr, 0 };
7601 VkEvent event;
7602 vkCreateEvent(m_device->device(), &eci, nullptr, &event);
7603
7604 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
7605 secondary.begin();
7606 vkCmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
7607 secondary.end();
7608
7609 m_commandBuffer->begin();
7610 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
7611 m_commandBuffer->end();
7612
7613 // destroying the event should invalidate both primary and secondary CB
7614 vkDestroyEvent(m_device->device(), event, nullptr);
7615
7616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "invalid because bound Event");
7617 m_commandBuffer->QueueCommandBuffer(false);
7618 m_errorMonitor->VerifyFound();
7619}
7620
Karl Schultz6addd812016-02-02 17:17:23 -07007621TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007622 // Cause error due to Begin while recording CB
7623 // Then cause 2 errors for attempting to reset CB w/o having
7624 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7625 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007627
Tony Barbour1fa09702017-03-16 12:09:08 -06007628 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007629
7630 // Calls AllocateCommandBuffers
7631 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7632
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007633 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007634 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007635 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7636 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007637 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7638 cmd_buf_info.pNext = NULL;
7639 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007640 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007641
7642 // Begin CB to transition to recording state
7643 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7644 // Can't re-begin. This should trigger error
7645 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007646 m_errorMonitor->VerifyFound();
7647
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007649 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007650 // Reset attempt will trigger error due to incorrect CommandPool state
7651 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007652 m_errorMonitor->VerifyFound();
7653
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007655 // Transition CB to RECORDED state
7656 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7657 // Now attempting to Begin will implicitly reset, which triggers error
7658 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007659 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007660}
7661
Karl Schultz6addd812016-02-02 17:17:23 -07007662TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007663 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007664 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007665
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7667 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007668
Tony Barbour1fa09702017-03-16 12:09:08 -06007669 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007670 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007671
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007672 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007673 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7674 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007675
7676 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007677 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7678 ds_pool_ci.pNext = NULL;
7679 ds_pool_ci.maxSets = 1;
7680 ds_pool_ci.poolSizeCount = 1;
7681 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007682
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007683 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007684 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007685 ASSERT_VK_SUCCESS(err);
7686
Tony Barboureb254902015-07-15 12:50:33 -06007687 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007688 dsl_binding.binding = 0;
7689 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7690 dsl_binding.descriptorCount = 1;
7691 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7692 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007693
Tony Barboureb254902015-07-15 12:50:33 -06007694 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007695 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7696 ds_layout_ci.pNext = NULL;
7697 ds_layout_ci.bindingCount = 1;
7698 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007699
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007700 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007701 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007702 ASSERT_VK_SUCCESS(err);
7703
7704 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007705 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007706 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007707 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007708 alloc_info.descriptorPool = ds_pool;
7709 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007710 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007711 ASSERT_VK_SUCCESS(err);
7712
Tony Barboureb254902015-07-15 12:50:33 -06007713 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007714 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7715 pipeline_layout_ci.setLayoutCount = 1;
7716 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007717
7718 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007719 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007720 ASSERT_VK_SUCCESS(err);
7721
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007722 VkViewport vp = {}; // Just need dummy vp to point to
7723 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007724
7725 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007726 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7727 vp_state_ci.scissorCount = 1;
7728 vp_state_ci.pScissors = &sc;
7729 vp_state_ci.viewportCount = 1;
7730 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007731
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007732 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7733 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7734 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7735 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7736 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7737 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007738 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007739 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007740 rs_state_ci.lineWidth = 1.0f;
7741
7742 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7743 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7744 vi_ci.pNext = nullptr;
7745 vi_ci.vertexBindingDescriptionCount = 0;
7746 vi_ci.pVertexBindingDescriptions = nullptr;
7747 vi_ci.vertexAttributeDescriptionCount = 0;
7748 vi_ci.pVertexAttributeDescriptions = nullptr;
7749
7750 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7751 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7752 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7753
7754 VkPipelineShaderStageCreateInfo shaderStages[2];
7755 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7756
7757 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7758 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007759 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007760 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007761
Tony Barboureb254902015-07-15 12:50:33 -06007762 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007763 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7764 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007765 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007766 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7767 gp_ci.layout = pipeline_layout;
7768 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007769 gp_ci.pVertexInputState = &vi_ci;
7770 gp_ci.pInputAssemblyState = &ia_ci;
7771
7772 gp_ci.stageCount = 1;
7773 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007774
7775 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007776 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7777 pc_ci.initialDataSize = 0;
7778 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007779
7780 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007781 VkPipelineCache pipelineCache;
7782
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007783 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007784 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007785 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007786 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007787
Chia-I Wuf7458c52015-10-26 21:10:41 +08007788 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7789 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7790 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7791 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007792}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007793
Tobin Ehlis912df022015-09-17 08:46:18 -06007794/*// TODO : This test should be good, but needs Tess support in compiler to run
7795TEST_F(VkLayerTest, InvalidPatchControlPoints)
7796{
7797 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007798 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007799
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007801 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7802primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007803
Tony Barbour1fa09702017-03-16 12:09:08 -06007804 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007805 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007806
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007807 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007808 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007809 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007810
7811 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7812 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7813 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007814 ds_pool_ci.poolSizeCount = 1;
7815 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007816
7817 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007818 err = vkCreateDescriptorPool(m_device->device(),
7819VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007820 ASSERT_VK_SUCCESS(err);
7821
7822 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007823 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007824 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007825 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007826 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7827 dsl_binding.pImmutableSamplers = NULL;
7828
7829 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007830 ds_layout_ci.sType =
7831VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007832 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007833 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007834 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007835
7836 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007837 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7838&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007839 ASSERT_VK_SUCCESS(err);
7840
7841 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007842 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7843VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007844 ASSERT_VK_SUCCESS(err);
7845
7846 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007847 pipeline_layout_ci.sType =
7848VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007849 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007850 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007851 pipeline_layout_ci.pSetLayouts = &ds_layout;
7852
7853 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007854 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7855&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007856 ASSERT_VK_SUCCESS(err);
7857
7858 VkPipelineShaderStageCreateInfo shaderStages[3];
7859 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7860
Karl Schultz6addd812016-02-02 17:17:23 -07007861 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7862this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007863 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007864 VkShaderObj
7865tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7866this);
7867 VkShaderObj
7868te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7869this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007870
Karl Schultz6addd812016-02-02 17:17:23 -07007871 shaderStages[0].sType =
7872VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007873 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007874 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007875 shaderStages[1].sType =
7876VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007877 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007878 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007879 shaderStages[2].sType =
7880VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007881 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007882 shaderStages[2].shader = te.handle();
7883
7884 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007885 iaCI.sType =
7886VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007887 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007888
7889 VkPipelineTessellationStateCreateInfo tsCI = {};
7890 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7891 tsCI.patchControlPoints = 0; // This will cause an error
7892
7893 VkGraphicsPipelineCreateInfo gp_ci = {};
7894 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7895 gp_ci.pNext = NULL;
7896 gp_ci.stageCount = 3;
7897 gp_ci.pStages = shaderStages;
7898 gp_ci.pVertexInputState = NULL;
7899 gp_ci.pInputAssemblyState = &iaCI;
7900 gp_ci.pTessellationState = &tsCI;
7901 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007902 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007903 gp_ci.pMultisampleState = NULL;
7904 gp_ci.pDepthStencilState = NULL;
7905 gp_ci.pColorBlendState = NULL;
7906 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7907 gp_ci.layout = pipeline_layout;
7908 gp_ci.renderPass = renderPass();
7909
7910 VkPipelineCacheCreateInfo pc_ci = {};
7911 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7912 pc_ci.pNext = NULL;
7913 pc_ci.initialSize = 0;
7914 pc_ci.initialData = 0;
7915 pc_ci.maxSize = 0;
7916
7917 VkPipeline pipeline;
7918 VkPipelineCache pipelineCache;
7919
Karl Schultz6addd812016-02-02 17:17:23 -07007920 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7921&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007922 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007923 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7924&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007925
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007926 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007927
Chia-I Wuf7458c52015-10-26 21:10:41 +08007928 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7929 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7930 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7931 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007932}
7933*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007934
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007935TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007936 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007937
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007938 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007939
Tony Barbour1fa09702017-03-16 12:09:08 -06007940 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007941 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007942
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007943 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007944 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7945 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007946
7947 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007948 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7949 ds_pool_ci.maxSets = 1;
7950 ds_pool_ci.poolSizeCount = 1;
7951 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007952
7953 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007954 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007955 ASSERT_VK_SUCCESS(err);
7956
7957 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007958 dsl_binding.binding = 0;
7959 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7960 dsl_binding.descriptorCount = 1;
7961 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007962
7963 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007964 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7965 ds_layout_ci.bindingCount = 1;
7966 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007967
7968 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007969 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007970 ASSERT_VK_SUCCESS(err);
7971
7972 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007973 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007974 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007975 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007976 alloc_info.descriptorPool = ds_pool;
7977 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007978 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007979 ASSERT_VK_SUCCESS(err);
7980
7981 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007982 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7983 pipeline_layout_ci.setLayoutCount = 1;
7984 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007985
7986 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007987 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007988 ASSERT_VK_SUCCESS(err);
7989
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007990 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007991 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007992 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007993 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007994 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007995 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007996
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007997 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7998 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7999 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8000 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8001 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8002 rs_state_ci.depthClampEnable = VK_FALSE;
8003 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8004 rs_state_ci.depthBiasEnable = VK_FALSE;
8005
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008006 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8007 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8008 vi_ci.pNext = nullptr;
8009 vi_ci.vertexBindingDescriptionCount = 0;
8010 vi_ci.pVertexBindingDescriptions = nullptr;
8011 vi_ci.vertexAttributeDescriptionCount = 0;
8012 vi_ci.pVertexAttributeDescriptions = nullptr;
8013
8014 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8015 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8016 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8017
8018 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8019 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8020 pipe_ms_state_ci.pNext = NULL;
8021 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8022 pipe_ms_state_ci.sampleShadingEnable = 0;
8023 pipe_ms_state_ci.minSampleShading = 1.0;
8024 pipe_ms_state_ci.pSampleMask = NULL;
8025
Cody Northropeb3a6c12015-10-05 14:44:45 -06008026 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008027 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008028
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008029 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008030 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08008031 shaderStages[0] = vs.GetStageCreateInfo();
8032 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008033
8034 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008035 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8036 gp_ci.stageCount = 2;
8037 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008038 gp_ci.pVertexInputState = &vi_ci;
8039 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008040 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008041 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008042 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008043 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8044 gp_ci.layout = pipeline_layout;
8045 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008046
8047 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008048 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008049
8050 VkPipeline pipeline;
8051 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008052 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008053 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008054
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008055 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008056 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008057
8058 // Check case where multiViewport is disabled and viewport count is not 1
8059 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
8061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
8062 vp_state_ci.scissorCount = 0;
8063 vp_state_ci.viewportCount = 0;
8064 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8065 m_errorMonitor->VerifyFound();
8066 } else {
8067 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008068 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008069 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008070 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008071
8072 // Check is that viewportcount and scissorcount match
8073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
8074 vp_state_ci.scissorCount = 1;
8075 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8076 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8077 m_errorMonitor->VerifyFound();
8078
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008079 // Check case where multiViewport is enabled and viewport count is greater than max
8080 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8083 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8084 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8085 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8086 m_errorMonitor->VerifyFound();
8087 }
8088 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008089
Chia-I Wuf7458c52015-10-26 21:10:41 +08008090 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8091 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8092 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8093 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008094}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008095
8096// 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
8097// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008098TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008099 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008100
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008101 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8102
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008104
Tony Barbour1fa09702017-03-16 12:09:08 -06008105 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008106 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008107
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008108 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008109 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8110 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008111
8112 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008113 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8114 ds_pool_ci.maxSets = 1;
8115 ds_pool_ci.poolSizeCount = 1;
8116 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008117
8118 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008119 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008120 ASSERT_VK_SUCCESS(err);
8121
8122 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008123 dsl_binding.binding = 0;
8124 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8125 dsl_binding.descriptorCount = 1;
8126 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008127
8128 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008129 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8130 ds_layout_ci.bindingCount = 1;
8131 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008132
8133 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008134 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008135 ASSERT_VK_SUCCESS(err);
8136
8137 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008138 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008139 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008140 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008141 alloc_info.descriptorPool = ds_pool;
8142 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008143 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008144 ASSERT_VK_SUCCESS(err);
8145
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008146 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8147 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8148 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8149
8150 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8151 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8152 vi_ci.pNext = nullptr;
8153 vi_ci.vertexBindingDescriptionCount = 0;
8154 vi_ci.pVertexBindingDescriptions = nullptr;
8155 vi_ci.vertexAttributeDescriptionCount = 0;
8156 vi_ci.pVertexAttributeDescriptions = nullptr;
8157
8158 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8159 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8160 pipe_ms_state_ci.pNext = NULL;
8161 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8162 pipe_ms_state_ci.sampleShadingEnable = 0;
8163 pipe_ms_state_ci.minSampleShading = 1.0;
8164 pipe_ms_state_ci.pSampleMask = NULL;
8165
Tobin Ehlise68360f2015-10-01 11:15:13 -06008166 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008167 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8168 pipeline_layout_ci.setLayoutCount = 1;
8169 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008170
8171 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008172 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008173 ASSERT_VK_SUCCESS(err);
8174
8175 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8176 // Set scissor as dynamic to avoid second error
8177 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008178 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8179 dyn_state_ci.dynamicStateCount = 1;
8180 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008181
Cody Northropeb3a6c12015-10-05 14:44:45 -06008182 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008183 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008184
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008185 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008186 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8187 // 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 +08008188 shaderStages[0] = vs.GetStageCreateInfo();
8189 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008190
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008191 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8192 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8193 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8194 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8195 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8196 rs_state_ci.depthClampEnable = VK_FALSE;
8197 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8198 rs_state_ci.depthBiasEnable = VK_FALSE;
8199
Tobin Ehlise68360f2015-10-01 11:15:13 -06008200 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008201 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8202 gp_ci.stageCount = 2;
8203 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008204 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008205 // Not setting VP state w/o dynamic vp state should cause validation error
8206 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008207 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008208 gp_ci.pVertexInputState = &vi_ci;
8209 gp_ci.pInputAssemblyState = &ia_ci;
8210 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008211 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8212 gp_ci.layout = pipeline_layout;
8213 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008214
8215 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008216 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008217
8218 VkPipeline pipeline;
8219 VkPipelineCache pipelineCache;
8220
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008221 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008222 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008223 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008224
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008225 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008226
Chia-I Wuf7458c52015-10-26 21:10:41 +08008227 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8228 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8229 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8230 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008231}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008232
8233// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8234// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008235TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8236 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008237
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008239
Tony Barbour1fa09702017-03-16 12:09:08 -06008240 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008241
8242 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008243 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008244 return;
8245 }
8246
Tobin Ehlise68360f2015-10-01 11:15:13 -06008247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008248
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008249 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008250 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8251 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008252
8253 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008254 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8255 ds_pool_ci.maxSets = 1;
8256 ds_pool_ci.poolSizeCount = 1;
8257 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008258
8259 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008260 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008261 ASSERT_VK_SUCCESS(err);
8262
8263 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008264 dsl_binding.binding = 0;
8265 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8266 dsl_binding.descriptorCount = 1;
8267 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008268
8269 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008270 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8271 ds_layout_ci.bindingCount = 1;
8272 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008273
8274 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008275 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008276 ASSERT_VK_SUCCESS(err);
8277
8278 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008279 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008280 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008281 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008282 alloc_info.descriptorPool = ds_pool;
8283 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008284 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008285 ASSERT_VK_SUCCESS(err);
8286
8287 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008288 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8289 pipeline_layout_ci.setLayoutCount = 1;
8290 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008291
8292 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008293 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008294 ASSERT_VK_SUCCESS(err);
8295
8296 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008297 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8298 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008299 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008300 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008301 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008302
8303 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8304 // Set scissor as dynamic to avoid that error
8305 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008306 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8307 dyn_state_ci.dynamicStateCount = 1;
8308 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008309
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008310 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8311 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8312 pipe_ms_state_ci.pNext = NULL;
8313 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8314 pipe_ms_state_ci.sampleShadingEnable = 0;
8315 pipe_ms_state_ci.minSampleShading = 1.0;
8316 pipe_ms_state_ci.pSampleMask = NULL;
8317
Cody Northropeb3a6c12015-10-05 14:44:45 -06008318 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008319 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008320
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008321 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008322 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8323 // 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 +08008324 shaderStages[0] = vs.GetStageCreateInfo();
8325 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008326
Cody Northropf6622dc2015-10-06 10:33:21 -06008327 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8328 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8329 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008330 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008331 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008332 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008333 vi_ci.pVertexAttributeDescriptions = nullptr;
8334
8335 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8336 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8337 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8338
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008339 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008340 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008341 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008342 rs_ci.pNext = nullptr;
8343
Mark Youngc89c6312016-03-31 16:03:20 -06008344 VkPipelineColorBlendAttachmentState att = {};
8345 att.blendEnable = VK_FALSE;
8346 att.colorWriteMask = 0xf;
8347
Cody Northropf6622dc2015-10-06 10:33:21 -06008348 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8349 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8350 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008351 cb_ci.attachmentCount = 1;
8352 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008353
Tobin Ehlise68360f2015-10-01 11:15:13 -06008354 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008355 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8356 gp_ci.stageCount = 2;
8357 gp_ci.pStages = shaderStages;
8358 gp_ci.pVertexInputState = &vi_ci;
8359 gp_ci.pInputAssemblyState = &ia_ci;
8360 gp_ci.pViewportState = &vp_state_ci;
8361 gp_ci.pRasterizationState = &rs_ci;
8362 gp_ci.pColorBlendState = &cb_ci;
8363 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008364 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008365 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8366 gp_ci.layout = pipeline_layout;
8367 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008368
8369 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008370 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008371
8372 VkPipeline pipeline;
8373 VkPipelineCache pipelineCache;
8374
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008375 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008376 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008377 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008378
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008379 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008380
Tobin Ehlisd332f282015-10-02 11:00:56 -06008381 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008382 // First need to successfully create the PSO from above by setting
8383 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008384 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 -07008385
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008386 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008387 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008388 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008389 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008390 m_commandBuffer->BeginCommandBuffer();
8391 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008392 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008393 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008394 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008395 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008396 Draw(1, 0, 0, 0);
8397
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008398 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008399
8400 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8401 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8402 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8403 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008404 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008405}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008406
8407// 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 -07008408// viewportCount
8409TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8410 VkResult err;
8411
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008413
Tony Barbour1fa09702017-03-16 12:09:08 -06008414 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008415
8416 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008417 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008418 return;
8419 }
8420
Karl Schultz6addd812016-02-02 17:17:23 -07008421 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8422
8423 VkDescriptorPoolSize ds_type_count = {};
8424 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8425 ds_type_count.descriptorCount = 1;
8426
8427 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8428 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8429 ds_pool_ci.maxSets = 1;
8430 ds_pool_ci.poolSizeCount = 1;
8431 ds_pool_ci.pPoolSizes = &ds_type_count;
8432
8433 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008434 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008435 ASSERT_VK_SUCCESS(err);
8436
8437 VkDescriptorSetLayoutBinding dsl_binding = {};
8438 dsl_binding.binding = 0;
8439 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8440 dsl_binding.descriptorCount = 1;
8441 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8442
8443 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8444 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8445 ds_layout_ci.bindingCount = 1;
8446 ds_layout_ci.pBindings = &dsl_binding;
8447
8448 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008449 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008450 ASSERT_VK_SUCCESS(err);
8451
8452 VkDescriptorSet descriptorSet;
8453 VkDescriptorSetAllocateInfo alloc_info = {};
8454 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8455 alloc_info.descriptorSetCount = 1;
8456 alloc_info.descriptorPool = ds_pool;
8457 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008458 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008459 ASSERT_VK_SUCCESS(err);
8460
8461 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8462 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8463 pipeline_layout_ci.setLayoutCount = 1;
8464 pipeline_layout_ci.pSetLayouts = &ds_layout;
8465
8466 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008467 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008468 ASSERT_VK_SUCCESS(err);
8469
8470 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8471 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8472 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008473 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008474 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008475 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008476
8477 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8478 // Set scissor as dynamic to avoid that error
8479 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8480 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8481 dyn_state_ci.dynamicStateCount = 1;
8482 dyn_state_ci.pDynamicStates = &vp_state;
8483
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008484 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8485 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8486 pipe_ms_state_ci.pNext = NULL;
8487 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8488 pipe_ms_state_ci.sampleShadingEnable = 0;
8489 pipe_ms_state_ci.minSampleShading = 1.0;
8490 pipe_ms_state_ci.pSampleMask = NULL;
8491
Karl Schultz6addd812016-02-02 17:17:23 -07008492 VkPipelineShaderStageCreateInfo shaderStages[2];
8493 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8494
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008495 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008496 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8497 // 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 -07008498 shaderStages[0] = vs.GetStageCreateInfo();
8499 shaderStages[1] = fs.GetStageCreateInfo();
8500
8501 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8502 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8503 vi_ci.pNext = nullptr;
8504 vi_ci.vertexBindingDescriptionCount = 0;
8505 vi_ci.pVertexBindingDescriptions = nullptr;
8506 vi_ci.vertexAttributeDescriptionCount = 0;
8507 vi_ci.pVertexAttributeDescriptions = nullptr;
8508
8509 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8510 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8511 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8512
8513 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8514 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008515 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008516 rs_ci.pNext = nullptr;
8517
Mark Youngc89c6312016-03-31 16:03:20 -06008518 VkPipelineColorBlendAttachmentState att = {};
8519 att.blendEnable = VK_FALSE;
8520 att.colorWriteMask = 0xf;
8521
Karl Schultz6addd812016-02-02 17:17:23 -07008522 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8523 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8524 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008525 cb_ci.attachmentCount = 1;
8526 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008527
8528 VkGraphicsPipelineCreateInfo gp_ci = {};
8529 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8530 gp_ci.stageCount = 2;
8531 gp_ci.pStages = shaderStages;
8532 gp_ci.pVertexInputState = &vi_ci;
8533 gp_ci.pInputAssemblyState = &ia_ci;
8534 gp_ci.pViewportState = &vp_state_ci;
8535 gp_ci.pRasterizationState = &rs_ci;
8536 gp_ci.pColorBlendState = &cb_ci;
8537 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008538 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008539 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8540 gp_ci.layout = pipeline_layout;
8541 gp_ci.renderPass = renderPass();
8542
8543 VkPipelineCacheCreateInfo pc_ci = {};
8544 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8545
8546 VkPipeline pipeline;
8547 VkPipelineCache pipelineCache;
8548
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008549 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008550 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008551 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008552
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008553 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008554
8555 // Now hit second fail case where we set scissor w/ different count than PSO
8556 // First need to successfully create the PSO from above by setting
8557 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8559 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008560
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008561 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008562 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008563 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008564 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008565 m_commandBuffer->BeginCommandBuffer();
8566 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008567 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008568 VkViewport viewports[1] = {};
8569 viewports[0].width = 8;
8570 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008571 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008572 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008573 Draw(1, 0, 0, 0);
8574
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008575 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008576
Chia-I Wuf7458c52015-10-26 21:10:41 +08008577 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8578 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8579 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8580 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008581 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008582}
8583
Mark Young7394fdd2016-03-31 14:56:43 -06008584TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8585 VkResult err;
8586
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008588
Tony Barbour1fa09702017-03-16 12:09:08 -06008589 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8591
8592 VkDescriptorPoolSize ds_type_count = {};
8593 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8594 ds_type_count.descriptorCount = 1;
8595
8596 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8597 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8598 ds_pool_ci.maxSets = 1;
8599 ds_pool_ci.poolSizeCount = 1;
8600 ds_pool_ci.pPoolSizes = &ds_type_count;
8601
8602 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008603 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008604 ASSERT_VK_SUCCESS(err);
8605
8606 VkDescriptorSetLayoutBinding dsl_binding = {};
8607 dsl_binding.binding = 0;
8608 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8609 dsl_binding.descriptorCount = 1;
8610 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8611
8612 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8613 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8614 ds_layout_ci.bindingCount = 1;
8615 ds_layout_ci.pBindings = &dsl_binding;
8616
8617 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008618 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008619 ASSERT_VK_SUCCESS(err);
8620
8621 VkDescriptorSet descriptorSet;
8622 VkDescriptorSetAllocateInfo alloc_info = {};
8623 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8624 alloc_info.descriptorSetCount = 1;
8625 alloc_info.descriptorPool = ds_pool;
8626 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008627 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008628 ASSERT_VK_SUCCESS(err);
8629
8630 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8631 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8632 pipeline_layout_ci.setLayoutCount = 1;
8633 pipeline_layout_ci.pSetLayouts = &ds_layout;
8634
8635 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008636 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008637 ASSERT_VK_SUCCESS(err);
8638
8639 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8640 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8641 vp_state_ci.scissorCount = 1;
8642 vp_state_ci.pScissors = NULL;
8643 vp_state_ci.viewportCount = 1;
8644 vp_state_ci.pViewports = NULL;
8645
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008646 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008647 // Set scissor as dynamic to avoid that error
8648 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8649 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8650 dyn_state_ci.dynamicStateCount = 2;
8651 dyn_state_ci.pDynamicStates = dynamic_states;
8652
8653 VkPipelineShaderStageCreateInfo shaderStages[2];
8654 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8655
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008656 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8657 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008658 this); // TODO - We shouldn't need a fragment shader
8659 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008660 shaderStages[0] = vs.GetStageCreateInfo();
8661 shaderStages[1] = fs.GetStageCreateInfo();
8662
8663 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8664 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8665 vi_ci.pNext = nullptr;
8666 vi_ci.vertexBindingDescriptionCount = 0;
8667 vi_ci.pVertexBindingDescriptions = nullptr;
8668 vi_ci.vertexAttributeDescriptionCount = 0;
8669 vi_ci.pVertexAttributeDescriptions = nullptr;
8670
8671 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8672 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8673 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8674
8675 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8676 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8677 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008678 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008679
Mark Young47107952016-05-02 15:59:55 -06008680 // Check too low (line width of -1.0f).
8681 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008682
8683 VkPipelineColorBlendAttachmentState att = {};
8684 att.blendEnable = VK_FALSE;
8685 att.colorWriteMask = 0xf;
8686
8687 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8688 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8689 cb_ci.pNext = nullptr;
8690 cb_ci.attachmentCount = 1;
8691 cb_ci.pAttachments = &att;
8692
8693 VkGraphicsPipelineCreateInfo gp_ci = {};
8694 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8695 gp_ci.stageCount = 2;
8696 gp_ci.pStages = shaderStages;
8697 gp_ci.pVertexInputState = &vi_ci;
8698 gp_ci.pInputAssemblyState = &ia_ci;
8699 gp_ci.pViewportState = &vp_state_ci;
8700 gp_ci.pRasterizationState = &rs_ci;
8701 gp_ci.pColorBlendState = &cb_ci;
8702 gp_ci.pDynamicState = &dyn_state_ci;
8703 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8704 gp_ci.layout = pipeline_layout;
8705 gp_ci.renderPass = renderPass();
8706
8707 VkPipelineCacheCreateInfo pc_ci = {};
8708 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8709
8710 VkPipeline pipeline;
8711 VkPipelineCache pipelineCache;
8712
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008713 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008714 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008715 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008716
8717 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008718 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008719
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008721
8722 // Check too high (line width of 65536.0f).
8723 rs_ci.lineWidth = 65536.0f;
8724
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008725 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008726 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008727 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008728
8729 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008730 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008731
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008733
8734 dyn_state_ci.dynamicStateCount = 3;
8735
8736 rs_ci.lineWidth = 1.0f;
8737
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008738 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008739 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008740 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008741 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008742 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008743
8744 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008745 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008746 m_errorMonitor->VerifyFound();
8747
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008749
8750 // Check too high with dynamic setting.
8751 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8752 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008753 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008754
8755 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8756 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8757 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8758 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008759 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008760}
8761
Jeremy Hayes37f0cdd2017-05-04 18:08:49 -06008762TEST_F(VkLayerTest, VALIDATION_ERROR_01407) {
8763 TEST_DESCRIPTION("Test VALIDATION_ERROR_01407: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
8764
8765 ASSERT_NO_FATAL_FAILURE(Init());
8766 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8767
8768 VkPipelineCache pipeline_cache;
8769 {
8770 VkPipelineCacheCreateInfo create_info{};
8771 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8772
8773 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8774 ASSERT_VK_SUCCESS(err);
8775 }
8776
8777 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8778 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8779
8780 VkPipelineShaderStageCreateInfo stages[2]{{}};
8781 stages[0] = vs.GetStageCreateInfo();
8782 stages[1] = fs.GetStageCreateInfo();
8783
8784 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
8785 VkVertexInputBindingDescription vertex_input_binding_description{};
8786 vertex_input_binding_description.binding = m_device->props.limits.maxVertexInputBindings;
8787
8788 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8789 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8790 vertex_input_state.pNext = nullptr;
8791 vertex_input_state.vertexBindingDescriptionCount = 1;
8792 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8793 vertex_input_state.vertexAttributeDescriptionCount = 0;
8794 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8795
8796 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8797 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8798 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8799
8800 VkViewport viewport{};
8801 VkPipelineViewportStateCreateInfo viewport_state{};
8802 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8803 viewport_state.scissorCount = 1;
8804 viewport_state.viewportCount = 1;
8805 viewport_state.pViewports = &viewport;
8806
8807 VkPipelineMultisampleStateCreateInfo multisample_state{};
8808 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8809 multisample_state.pNext = nullptr;
8810 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8811 multisample_state.sampleShadingEnable = 0;
8812 multisample_state.minSampleShading = 1.0;
8813 multisample_state.pSampleMask = nullptr;
8814
8815 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8816 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8817 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8818 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8819 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8820 rasterization_state.depthClampEnable = VK_FALSE;
8821 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8822 rasterization_state.depthBiasEnable = VK_FALSE;
8823
8824 VkPipelineLayout pipeline_layout;
8825 {
8826 VkPipelineLayoutCreateInfo create_info{};
8827 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8828 create_info.setLayoutCount = 0;
8829 create_info.pSetLayouts = nullptr;
8830
8831 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8832 ASSERT_VK_SUCCESS(err);
8833 }
8834
8835 {
8836 VkGraphicsPipelineCreateInfo create_info{};
8837 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8838 create_info.stageCount = 2;
8839 create_info.pStages = stages;
8840 create_info.pVertexInputState = &vertex_input_state;
8841 create_info.pInputAssemblyState = &input_assembly_state;
8842 create_info.pViewportState = &viewport_state;
8843 create_info.pMultisampleState = &multisample_state;
8844 create_info.pRasterizationState = &rasterization_state;
8845 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8846 create_info.layout = pipeline_layout;
8847 create_info.renderPass = renderPass();
8848
8849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01407);
8850 VkPipeline pipeline;
8851 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8852 m_errorMonitor->VerifyFound();
8853 }
8854
8855 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8856 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8857}
8858
8859TEST_F(VkLayerTest, VALIDATION_ERROR_01408) {
8860 TEST_DESCRIPTION(
8861 "Test VALIDATION_ERROR_01408: stride must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindingStride");
8862
8863 ASSERT_NO_FATAL_FAILURE(Init());
8864 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8865
8866 VkPipelineCache pipeline_cache;
8867 {
8868 VkPipelineCacheCreateInfo create_info{};
8869 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8870
8871 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8872 ASSERT_VK_SUCCESS(err);
8873 }
8874
8875 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8876 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8877
8878 VkPipelineShaderStageCreateInfo stages[2]{{}};
8879 stages[0] = vs.GetStageCreateInfo();
8880 stages[1] = fs.GetStageCreateInfo();
8881
8882 // Test when stride is greater than VkPhysicalDeviceLimits::maxVertexInputBindingStride.
8883 VkVertexInputBindingDescription vertex_input_binding_description{};
8884 vertex_input_binding_description.stride = m_device->props.limits.maxVertexInputBindingStride + 1;
8885
8886 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8887 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8888 vertex_input_state.pNext = nullptr;
8889 vertex_input_state.vertexBindingDescriptionCount = 1;
8890 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8891 vertex_input_state.vertexAttributeDescriptionCount = 0;
8892 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8893
8894 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8895 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8896 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8897
8898 VkViewport viewport{};
8899 VkPipelineViewportStateCreateInfo viewport_state{};
8900 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8901 viewport_state.scissorCount = 1;
8902 viewport_state.viewportCount = 1;
8903 viewport_state.pViewports = &viewport;
8904
8905 VkPipelineMultisampleStateCreateInfo multisample_state{};
8906 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8907 multisample_state.pNext = nullptr;
8908 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8909 multisample_state.sampleShadingEnable = 0;
8910 multisample_state.minSampleShading = 1.0;
8911 multisample_state.pSampleMask = nullptr;
8912
8913 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8914 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8915 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8916 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8917 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8918 rasterization_state.depthClampEnable = VK_FALSE;
8919 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8920 rasterization_state.depthBiasEnable = VK_FALSE;
8921
8922 VkPipelineLayout pipeline_layout;
8923 {
8924 VkPipelineLayoutCreateInfo create_info{};
8925 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8926 create_info.setLayoutCount = 0;
8927 create_info.pSetLayouts = nullptr;
8928
8929 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8930 ASSERT_VK_SUCCESS(err);
8931 }
8932
8933 {
8934 VkGraphicsPipelineCreateInfo create_info{};
8935 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8936 create_info.stageCount = 2;
8937 create_info.pStages = stages;
8938 create_info.pVertexInputState = &vertex_input_state;
8939 create_info.pInputAssemblyState = &input_assembly_state;
8940 create_info.pViewportState = &viewport_state;
8941 create_info.pMultisampleState = &multisample_state;
8942 create_info.pRasterizationState = &rasterization_state;
8943 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8944 create_info.layout = pipeline_layout;
8945 create_info.renderPass = renderPass();
8946
8947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01408);
8948 VkPipeline pipeline;
8949 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8950 m_errorMonitor->VerifyFound();
8951 }
8952
8953 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8954 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8955}
8956
Jeremy Hayes091e1ab2017-05-04 18:10:28 -06008957TEST_F(VkLayerTest, VALIDATION_ERROR_01410) {
8958 TEST_DESCRIPTION("Test VALIDATION_ERROR_01410: location must be less than VkPhysicalDeviceLimits::maxVertexInputAttributes");
8959
8960 ASSERT_NO_FATAL_FAILURE(Init());
8961 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8962
8963 VkPipelineCache pipeline_cache;
8964 {
8965 VkPipelineCacheCreateInfo create_info{};
8966 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8967
8968 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8969 ASSERT_VK_SUCCESS(err);
8970 }
8971
8972 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8973 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8974
8975 VkPipelineShaderStageCreateInfo stages[2]{{}};
8976 stages[0] = vs.GetStageCreateInfo();
8977 stages[1] = fs.GetStageCreateInfo();
8978
8979 // Test when location is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributes.
8980 VkVertexInputAttributeDescription vertex_input_attribute_description{};
8981 vertex_input_attribute_description.location = m_device->props.limits.maxVertexInputAttributes;
8982
8983 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8984 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8985 vertex_input_state.pNext = nullptr;
8986 vertex_input_state.vertexBindingDescriptionCount = 0;
8987 vertex_input_state.pVertexBindingDescriptions = nullptr;
8988 vertex_input_state.vertexAttributeDescriptionCount = 1;
8989 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
8990
8991 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8992 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8993 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8994
8995 VkViewport viewport{};
8996 VkPipelineViewportStateCreateInfo viewport_state{};
8997 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8998 viewport_state.scissorCount = 1;
8999 viewport_state.viewportCount = 1;
9000 viewport_state.pViewports = &viewport;
9001
9002 VkPipelineMultisampleStateCreateInfo multisample_state{};
9003 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9004 multisample_state.pNext = nullptr;
9005 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9006 multisample_state.sampleShadingEnable = 0;
9007 multisample_state.minSampleShading = 1.0;
9008 multisample_state.pSampleMask = nullptr;
9009
9010 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9011 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9012 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9013 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9014 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9015 rasterization_state.depthClampEnable = VK_FALSE;
9016 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9017 rasterization_state.depthBiasEnable = VK_FALSE;
9018
9019 VkPipelineLayout pipeline_layout;
9020 {
9021 VkPipelineLayoutCreateInfo create_info{};
9022 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9023 create_info.setLayoutCount = 0;
9024 create_info.pSetLayouts = nullptr;
9025
9026 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9027 ASSERT_VK_SUCCESS(err);
9028 }
9029
9030 {
9031 VkGraphicsPipelineCreateInfo create_info{};
9032 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9033 create_info.stageCount = 2;
9034 create_info.pStages = stages;
9035 create_info.pVertexInputState = &vertex_input_state;
9036 create_info.pInputAssemblyState = &input_assembly_state;
9037 create_info.pViewportState = &viewport_state;
9038 create_info.pMultisampleState = &multisample_state;
9039 create_info.pRasterizationState = &rasterization_state;
9040 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9041 create_info.layout = pipeline_layout;
9042 create_info.renderPass = renderPass();
9043
9044 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01410);
9045 VkPipeline pipeline;
9046 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9047 m_errorMonitor->VerifyFound();
9048 }
9049
9050 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9051 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9052}
9053
9054TEST_F(VkLayerTest, VALIDATION_ERROR_01411) {
9055 TEST_DESCRIPTION("Test VALIDATION_ERROR_01411: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
9056
9057 ASSERT_NO_FATAL_FAILURE(Init());
9058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9059
9060 VkPipelineCache pipeline_cache;
9061 {
9062 VkPipelineCacheCreateInfo create_info{};
9063 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9064
9065 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
9066 ASSERT_VK_SUCCESS(err);
9067 }
9068
9069 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9070 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9071
9072 VkPipelineShaderStageCreateInfo stages[2]{{}};
9073 stages[0] = vs.GetStageCreateInfo();
9074 stages[1] = fs.GetStageCreateInfo();
9075
9076 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
9077 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9078 vertex_input_attribute_description.binding = m_device->props.limits.maxVertexInputBindings;
9079
9080 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9081 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9082 vertex_input_state.pNext = nullptr;
9083 vertex_input_state.vertexBindingDescriptionCount = 0;
9084 vertex_input_state.pVertexBindingDescriptions = nullptr;
9085 vertex_input_state.vertexAttributeDescriptionCount = 1;
9086 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9087
9088 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9089 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9090 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9091
9092 VkViewport viewport{};
9093 VkPipelineViewportStateCreateInfo viewport_state{};
9094 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9095 viewport_state.scissorCount = 1;
9096 viewport_state.viewportCount = 1;
9097 viewport_state.pViewports = &viewport;
9098
9099 VkPipelineMultisampleStateCreateInfo multisample_state{};
9100 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9101 multisample_state.pNext = nullptr;
9102 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9103 multisample_state.sampleShadingEnable = 0;
9104 multisample_state.minSampleShading = 1.0;
9105 multisample_state.pSampleMask = nullptr;
9106
9107 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9108 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9109 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9110 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9111 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9112 rasterization_state.depthClampEnable = VK_FALSE;
9113 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9114 rasterization_state.depthBiasEnable = VK_FALSE;
9115
9116 VkPipelineLayout pipeline_layout;
9117 {
9118 VkPipelineLayoutCreateInfo create_info{};
9119 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9120 create_info.setLayoutCount = 0;
9121 create_info.pSetLayouts = nullptr;
9122
9123 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9124 ASSERT_VK_SUCCESS(err);
9125 }
9126
9127 {
9128 VkGraphicsPipelineCreateInfo create_info{};
9129 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9130 create_info.stageCount = 2;
9131 create_info.pStages = stages;
9132 create_info.pVertexInputState = &vertex_input_state;
9133 create_info.pInputAssemblyState = &input_assembly_state;
9134 create_info.pViewportState = &viewport_state;
9135 create_info.pMultisampleState = &multisample_state;
9136 create_info.pRasterizationState = &rasterization_state;
9137 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9138 create_info.layout = pipeline_layout;
9139 create_info.renderPass = renderPass();
9140
9141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01411);
9142 VkPipeline pipeline;
9143 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9144 m_errorMonitor->VerifyFound();
9145 }
9146
9147 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9148 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9149}
9150
9151TEST_F(VkLayerTest, VALIDATION_ERROR_01412) {
9152 TEST_DESCRIPTION(
9153 "Test VALIDATION_ERROR_01412: offset must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributeOffset");
9154
9155 ASSERT_NO_FATAL_FAILURE(Init());
9156 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9157
9158 VkPipelineCache pipeline_cache;
9159 {
9160 VkPipelineCacheCreateInfo create_info{};
9161 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9162
9163 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
9164 ASSERT_VK_SUCCESS(err);
9165 }
9166
9167 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9168 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9169
9170 VkPipelineShaderStageCreateInfo stages[2]{{}};
9171 stages[0] = vs.GetStageCreateInfo();
9172 stages[1] = fs.GetStageCreateInfo();
9173
9174 // Test when offset is greater than maximum.
9175 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9176 vertex_input_attribute_description.offset = m_device->props.limits.maxVertexInputAttributeOffset + 1;
9177
9178 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9179 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9180 vertex_input_state.pNext = nullptr;
9181 vertex_input_state.vertexBindingDescriptionCount = 0;
9182 vertex_input_state.pVertexBindingDescriptions = nullptr;
9183 vertex_input_state.vertexAttributeDescriptionCount = 1;
9184 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9185
9186 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9187 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9188 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9189
9190 VkViewport viewport{};
9191 VkPipelineViewportStateCreateInfo viewport_state{};
9192 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9193 viewport_state.scissorCount = 1;
9194 viewport_state.viewportCount = 1;
9195 viewport_state.pViewports = &viewport;
9196
9197 VkPipelineMultisampleStateCreateInfo multisample_state{};
9198 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9199 multisample_state.pNext = nullptr;
9200 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9201 multisample_state.sampleShadingEnable = 0;
9202 multisample_state.minSampleShading = 1.0;
9203 multisample_state.pSampleMask = nullptr;
9204
9205 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9206 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9207 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9208 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9209 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9210 rasterization_state.depthClampEnable = VK_FALSE;
9211 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9212 rasterization_state.depthBiasEnable = VK_FALSE;
9213
9214 VkPipelineLayout pipeline_layout;
9215 {
9216 VkPipelineLayoutCreateInfo create_info{};
9217 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9218 create_info.setLayoutCount = 0;
9219 create_info.pSetLayouts = nullptr;
9220
9221 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9222 ASSERT_VK_SUCCESS(err);
9223 }
9224
9225 {
9226 VkGraphicsPipelineCreateInfo create_info{};
9227 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9228 create_info.stageCount = 2;
9229 create_info.pStages = stages;
9230 create_info.pVertexInputState = &vertex_input_state;
9231 create_info.pInputAssemblyState = &input_assembly_state;
9232 create_info.pViewportState = &viewport_state;
9233 create_info.pMultisampleState = &multisample_state;
9234 create_info.pRasterizationState = &rasterization_state;
9235 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9236 create_info.layout = pipeline_layout;
9237 create_info.renderPass = renderPass();
9238
9239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01412);
9240 VkPipeline pipeline;
9241 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9242 m_errorMonitor->VerifyFound();
9243 }
9244
9245 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9246 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9247}
9248
Karl Schultz6addd812016-02-02 17:17:23 -07009249TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009250 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07009252 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009253
Tony Barbour1fa09702017-03-16 12:09:08 -06009254 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009255 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009256
Tony Barbour552f6c02016-12-21 14:34:07 -07009257 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009258 // Don't care about RenderPass handle b/c error should be flagged before
9259 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009260 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009261
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009262 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009263}
9264
Karl Schultz6addd812016-02-02 17:17:23 -07009265TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009266 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9268 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009269
Tony Barbour1fa09702017-03-16 12:09:08 -06009270 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009271 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009272
Tony Barbour552f6c02016-12-21 14:34:07 -07009273 m_commandBuffer->BeginCommandBuffer();
9274 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07009275 // Just create a dummy Renderpass that's non-NULL so we can get to the
9276 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009277 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009278
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009279 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009280}
9281
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009282TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009283 TEST_DESCRIPTION(
9284 "Begin a renderPass where clearValueCount is less than"
9285 "the number of renderPass attachments that use loadOp"
9286 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009287
Tony Barbour1fa09702017-03-16 12:09:08 -06009288 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009289 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9290
9291 // Create a renderPass with a single attachment that uses loadOp CLEAR
9292 VkAttachmentReference attach = {};
9293 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9294 VkSubpassDescription subpass = {};
Cort Stratton7547f772017-05-04 15:18:52 -07009295 subpass.colorAttachmentCount = 1;
9296 subpass.pColorAttachments = &attach;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009297 VkRenderPassCreateInfo rpci = {};
9298 rpci.subpassCount = 1;
9299 rpci.pSubpasses = &subpass;
9300 rpci.attachmentCount = 1;
9301 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07009302 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009303 // Set loadOp to CLEAR
9304 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9305 rpci.pAttachments = &attach_desc;
9306 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9307 VkRenderPass rp;
9308 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9309
9310 VkCommandBufferInheritanceInfo hinfo = {};
9311 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9312 hinfo.renderPass = VK_NULL_HANDLE;
9313 hinfo.subpass = 0;
9314 hinfo.framebuffer = VK_NULL_HANDLE;
9315 hinfo.occlusionQueryEnable = VK_FALSE;
9316 hinfo.queryFlags = 0;
9317 hinfo.pipelineStatistics = 0;
9318 VkCommandBufferBeginInfo info = {};
9319 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9320 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9321 info.pInheritanceInfo = &hinfo;
9322
9323 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9324 VkRenderPassBeginInfo rp_begin = {};
9325 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9326 rp_begin.pNext = NULL;
9327 rp_begin.renderPass = renderPass();
9328 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009329 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009330
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009332
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009333 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009334
9335 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009336
9337 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009338}
9339
Slawomir Cygan0808f392016-11-28 17:53:23 +01009340TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009341 TEST_DESCRIPTION(
9342 "Begin a renderPass where clearValueCount is greater than"
9343 "the number of renderPass attachments that use loadOp"
9344 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01009345
Tony Barbour1fa09702017-03-16 12:09:08 -06009346 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01009347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9348
9349 // Create a renderPass with a single attachment that uses loadOp CLEAR
9350 VkAttachmentReference attach = {};
9351 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9352 VkSubpassDescription subpass = {};
Cort Stratton7547f772017-05-04 15:18:52 -07009353 subpass.colorAttachmentCount = 1;
9354 subpass.pColorAttachments = &attach;
Slawomir Cygan0808f392016-11-28 17:53:23 +01009355 VkRenderPassCreateInfo rpci = {};
9356 rpci.subpassCount = 1;
9357 rpci.pSubpasses = &subpass;
9358 rpci.attachmentCount = 1;
9359 VkAttachmentDescription attach_desc = {};
9360 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
9361 // Set loadOp to CLEAR
9362 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9363 rpci.pAttachments = &attach_desc;
9364 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9365 VkRenderPass rp;
9366 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9367
9368 VkCommandBufferBeginInfo info = {};
9369 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9370 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9371
9372 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9373 VkRenderPassBeginInfo rp_begin = {};
9374 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9375 rp_begin.pNext = NULL;
9376 rp_begin.renderPass = renderPass();
9377 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009378 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01009379
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
9381 " has a clearValueCount of"
9382 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01009383
9384 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
9385
9386 m_errorMonitor->VerifyFound();
9387
9388 vkDestroyRenderPass(m_device->device(), rp, NULL);
9389}
9390
Cody Northrop3bb4d962016-05-09 16:15:57 -06009391TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06009392 TEST_DESCRIPTION("End a command buffer with an active render pass");
9393
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9395 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06009396
Tony Barbour1fa09702017-03-16 12:09:08 -06009397 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009398 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9399
Tony Barbour552f6c02016-12-21 14:34:07 -07009400 m_commandBuffer->BeginCommandBuffer();
9401 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9402 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009403
9404 m_errorMonitor->VerifyFound();
9405
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009406 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9407 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06009408}
9409
Karl Schultz6addd812016-02-02 17:17:23 -07009410TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009411 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9413 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009414
Tony Barbour1fa09702017-03-16 12:09:08 -06009415 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009416 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009417
Tony Barbour552f6c02016-12-21 14:34:07 -07009418 m_commandBuffer->BeginCommandBuffer();
9419 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009420
9421 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009422 vk_testing::Buffer dstBuffer;
9423 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009424
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009425 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009426
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009427 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009428}
9429
Karl Schultz6addd812016-02-02 17:17:23 -07009430TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009431 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9433 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009434
Tony Barbour1fa09702017-03-16 12:09:08 -06009435 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009436 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009437
Tony Barbour552f6c02016-12-21 14:34:07 -07009438 m_commandBuffer->BeginCommandBuffer();
9439 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009440
9441 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009442 vk_testing::Buffer dstBuffer;
9443 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009444
Karl Schultz6addd812016-02-02 17:17:23 -07009445 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07009446 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
9447 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
9448 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009449
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009450 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009451}
9452
Karl Schultz6addd812016-02-02 17:17:23 -07009453TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009454 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9456 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009457
Tony Barbour1fa09702017-03-16 12:09:08 -06009458 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009459 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009460
Tony Barbour552f6c02016-12-21 14:34:07 -07009461 m_commandBuffer->BeginCommandBuffer();
9462 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009463
Michael Lentine0a369f62016-02-03 16:51:46 -06009464 VkClearColorValue clear_color;
9465 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009466 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9467 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9468 const int32_t tex_width = 32;
9469 const int32_t tex_height = 32;
9470 VkImageCreateInfo image_create_info = {};
9471 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9472 image_create_info.pNext = NULL;
9473 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9474 image_create_info.format = tex_format;
9475 image_create_info.extent.width = tex_width;
9476 image_create_info.extent.height = tex_height;
9477 image_create_info.extent.depth = 1;
9478 image_create_info.mipLevels = 1;
9479 image_create_info.arrayLayers = 1;
9480 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9481 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07009482 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009483
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009484 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009485 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009486
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009487 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009488
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009489 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009490
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009491 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009492}
9493
Karl Schultz6addd812016-02-02 17:17:23 -07009494TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009495 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9497 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009498
Tony Barbour1fa09702017-03-16 12:09:08 -06009499 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009500 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009501
Dave Houlton1d2022c2017-03-29 11:43:58 -06009502 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009503 if (!depth_format) {
9504 printf(" No Depth + Stencil format found. Skipped.\n");
9505 return;
9506 }
9507
Tony Barbour552f6c02016-12-21 14:34:07 -07009508 m_commandBuffer->BeginCommandBuffer();
9509 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009510
9511 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009512 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009513 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9514 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07009515 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07009516 image_create_info.extent.width = 64;
9517 image_create_info.extent.height = 64;
9518 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9519 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009520
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009521 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009522 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009523
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009524 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009525
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009526 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9527 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009528
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009529 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009530}
9531
Karl Schultz6addd812016-02-02 17:17:23 -07009532TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009533 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009534 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009535
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9537 "vkCmdClearAttachments(): This call "
9538 "must be issued inside an active "
9539 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009540
Tony Barbour1fa09702017-03-16 12:09:08 -06009541 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009542 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009543
9544 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009545 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009546 ASSERT_VK_SUCCESS(err);
9547
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009548 VkClearAttachment color_attachment;
9549 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9550 color_attachment.clearValue.color.float32[0] = 0;
9551 color_attachment.clearValue.color.float32[1] = 0;
9552 color_attachment.clearValue.color.float32[2] = 0;
9553 color_attachment.clearValue.color.float32[3] = 0;
9554 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009555 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009556 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009557
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009558 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009559}
9560
Chris Forbes3b97e932016-09-07 11:29:24 +12009561TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009562 TEST_DESCRIPTION(
9563 "Test that an error is produced when CmdNextSubpass is "
9564 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009565
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9567 "vkCmdNextSubpass(): Attempted to advance "
9568 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009569
Tony Barbour1fa09702017-03-16 12:09:08 -06009570 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009571 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9572
Tony Barbour552f6c02016-12-21 14:34:07 -07009573 m_commandBuffer->BeginCommandBuffer();
9574 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009575
9576 // error here.
9577 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9578 m_errorMonitor->VerifyFound();
9579
Tony Barbour552f6c02016-12-21 14:34:07 -07009580 m_commandBuffer->EndRenderPass();
9581 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009582}
9583
Chris Forbes6d624702016-09-07 13:57:05 +12009584TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009585 TEST_DESCRIPTION(
9586 "Test that an error is produced when CmdEndRenderPass is "
9587 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009588
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9590 "vkCmdEndRenderPass(): Called before reaching "
9591 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009592
Tony Barbour1fa09702017-03-16 12:09:08 -06009593 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009594 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9595 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009596
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009597 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009598
9599 VkRenderPass rp;
9600 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9601 ASSERT_VK_SUCCESS(err);
9602
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009603 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009604
9605 VkFramebuffer fb;
9606 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9607 ASSERT_VK_SUCCESS(err);
9608
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009609 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009610
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009611 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 +12009612
9613 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9614
9615 // Error here.
9616 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9617 m_errorMonitor->VerifyFound();
9618
9619 // Clean up.
9620 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9621 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9622}
9623
Karl Schultz9e66a292016-04-21 15:57:51 -06009624TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9625 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9627 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009628
Tony Barbour1fa09702017-03-16 12:09:08 -06009629 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009630 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009631
9632 VkBufferMemoryBarrier buf_barrier = {};
9633 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9634 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9635 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9636 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9637 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9638 buf_barrier.buffer = VK_NULL_HANDLE;
9639 buf_barrier.offset = 0;
9640 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009641 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9642 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009643
9644 m_errorMonitor->VerifyFound();
9645}
9646
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009647TEST_F(VkLayerTest, InvalidBarriers) {
9648 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9649
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009651
Tony Barbour1fa09702017-03-16 12:09:08 -06009652 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009653 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009654 if (!depth_format) {
9655 printf(" No Depth + Stencil format found. Skipped.\n");
9656 return;
9657 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9659
9660 VkMemoryBarrier mem_barrier = {};
9661 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9662 mem_barrier.pNext = NULL;
9663 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9664 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009665 m_commandBuffer->BeginCommandBuffer();
9666 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009667 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009668 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009669 &mem_barrier, 0, nullptr, 0, nullptr);
9670 m_errorMonitor->VerifyFound();
9671
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009673 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009674 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 -06009675 ASSERT_TRUE(image.initialized());
9676 VkImageMemoryBarrier img_barrier = {};
9677 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9678 img_barrier.pNext = NULL;
9679 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9680 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009681 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009682 // New layout can't be UNDEFINED
9683 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9684 img_barrier.image = image.handle();
9685 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9686 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9687 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9688 img_barrier.subresourceRange.baseArrayLayer = 0;
9689 img_barrier.subresourceRange.baseMipLevel = 0;
9690 img_barrier.subresourceRange.layerCount = 1;
9691 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009692 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9693 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009694 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009695
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009696 // Transition image to color attachment optimal
9697 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9698 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9699 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9700 nullptr, 0, nullptr, 1, &img_barrier);
9701 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009702
Mark Lobodzinski45daf6e2017-05-10 13:19:02 -06009703 // Try to change layout in a renderpass
9704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02080);
9705 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9706 nullptr, 0, nullptr, 1, &img_barrier);
9707 m_errorMonitor->VerifyFound();
9708
9709 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009711 // baseArrayLayer + layerCount must be <= image's arrayLayers
9712 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009713 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9714 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009715 m_errorMonitor->VerifyFound();
9716 img_barrier.subresourceRange.baseArrayLayer = 0;
9717
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009719 // baseMipLevel + levelCount must be <= image's mipLevels
9720 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009721 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9722 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009723 m_errorMonitor->VerifyFound();
9724 img_barrier.subresourceRange.baseMipLevel = 0;
9725
Mike Weiblen7053aa32017-01-25 15:21:10 -07009726 // levelCount must be non-zero.
9727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9728 img_barrier.subresourceRange.levelCount = 0;
9729 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9730 nullptr, 0, nullptr, 1, &img_barrier);
9731 m_errorMonitor->VerifyFound();
9732 img_barrier.subresourceRange.levelCount = 1;
9733
9734 // layerCount must be non-zero.
9735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9736 img_barrier.subresourceRange.layerCount = 0;
9737 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9738 nullptr, 0, nullptr, 1, &img_barrier);
9739 m_errorMonitor->VerifyFound();
9740 img_barrier.subresourceRange.layerCount = 1;
9741
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009742 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 -06009743 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009744 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9745 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009746 VkBufferMemoryBarrier buf_barrier = {};
9747 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9748 buf_barrier.pNext = NULL;
9749 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9750 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9751 buf_barrier.buffer = buffer.handle();
9752 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9753 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9754 buf_barrier.offset = 0;
9755 buf_barrier.size = VK_WHOLE_SIZE;
9756 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009757 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9758 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009759 m_errorMonitor->VerifyFound();
9760 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9761
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009763 buf_barrier.offset = 257;
9764 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009765 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9766 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009767 m_errorMonitor->VerifyFound();
9768 buf_barrier.offset = 0;
9769
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009771 buf_barrier.size = 257;
9772 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009773 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9774 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009775 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009776
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009777 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
9779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009780 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009781 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009782 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009783 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9784 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009785 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009786
9787 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009788 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009789 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9790 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009791 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009792
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009793 // Having only one of depth or stencil set for DS image is an error
9794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
9795 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
9796 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9797 nullptr, 0, nullptr, 1, &img_barrier);
9798 m_errorMonitor->VerifyFound();
9799
9800 // Having anything other than DEPTH and STENCIL is an error
9801 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Dave Houltonfbf52152017-01-06 12:55:29 -07009802 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9803 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9804 nullptr, 0, nullptr, 1, &img_barrier);
9805 m_errorMonitor->VerifyFound();
9806
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009807 // Now test depth-only
9808 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009809 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9810 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009811 VkDepthStencilObj d_image(m_device);
9812 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9813 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009814 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009815 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009816 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009817
9818 // DEPTH bit must be set
9819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9820 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009821 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009822 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9823 0, nullptr, 0, nullptr, 1, &img_barrier);
9824 m_errorMonitor->VerifyFound();
9825
9826 // No bits other than DEPTH may be set
9827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9828 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9829 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009830 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9831 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009832 m_errorMonitor->VerifyFound();
9833 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009834
9835 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009836 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9837 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009838 VkDepthStencilObj s_image(m_device);
9839 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9840 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009841 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009842 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009843 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009844 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9846 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009847 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009848 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9849 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009850 m_errorMonitor->VerifyFound();
9851 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009852
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009853 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009854 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009855 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 -06009856 ASSERT_TRUE(c_image.initialized());
9857 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9858 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9859 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009860
9861 // COLOR bit must be set
9862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9863 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009864 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009865 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9866 nullptr, 0, nullptr, 1, &img_barrier);
9867 m_errorMonitor->VerifyFound();
9868
9869 // No bits other than COLOR may be set
9870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9871 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9872 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009873 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9874 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009875 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009876
Mike Weiblene6e01172017-03-07 22:18:40 -07009877 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9878 {
9879 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009880 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 -07009881 ASSERT_TRUE(img_color.initialized());
9882
9883 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009884 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 -07009885 ASSERT_TRUE(img_ds.initialized());
9886
9887 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009888 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 -07009889 ASSERT_TRUE(img_xfer_src.initialized());
9890
9891 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009892 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 -07009893 ASSERT_TRUE(img_xfer_dst.initialized());
9894
9895 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009896 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 -07009897 ASSERT_TRUE(img_sampled.initialized());
9898
9899 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009900 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 -07009901 ASSERT_TRUE(img_input.initialized());
9902
9903 const struct {
9904 VkImageObj &image_obj;
9905 VkImageLayout bad_layout;
9906 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9907 } bad_buffer_layouts[] = {
9908 // clang-format off
9909 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9910 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9911 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9912 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9913 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9914 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9915 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9916 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9917 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9918 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9919 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9920 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9921 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9922 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9923 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9924 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9925 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9926 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9927 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9928 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9929 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9930 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9931 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9932 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9933 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9934 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9935 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9936 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9937 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9938 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9939 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9940 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9941 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9942 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9943 // clang-format on
9944 };
9945 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9946
9947 for (uint32_t i = 0; i < layout_count; ++i) {
9948 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9949 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9950 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9951 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9952 : VK_IMAGE_ASPECT_COLOR_BIT;
9953
9954 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9955 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9957 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9958 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9959 m_errorMonitor->VerifyFound();
9960
9961 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9962 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9964 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9965 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9966 m_errorMonitor->VerifyFound();
9967 }
9968
9969 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9970 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9971 }
9972
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009973 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9974
9975 // Create command pool with incompatible queueflags
9976 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009977 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009978 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009979 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009980 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009981 }
9982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9983
9984 VkCommandPool command_pool;
9985 VkCommandPoolCreateInfo pool_create_info{};
9986 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9987 pool_create_info.queueFamilyIndex = queue_family_index;
9988 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9989 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9990
9991 // Allocate a command buffer
9992 VkCommandBuffer bad_command_buffer;
9993 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9994 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9995 command_buffer_allocate_info.commandPool = command_pool;
9996 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9997 command_buffer_allocate_info.commandBufferCount = 1;
9998 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9999
10000 VkCommandBufferBeginInfo cbbi = {};
10001 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10002 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
10003 buf_barrier.offset = 0;
10004 buf_barrier.size = VK_WHOLE_SIZE;
10005 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
10006 &buf_barrier, 0, nullptr);
10007 m_errorMonitor->VerifyFound();
10008
10009 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
10010 vkEndCommandBuffer(bad_command_buffer);
10011 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010012 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -070010013 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -070010014 }
10015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
10016 VkEvent event;
10017 VkEventCreateInfo event_create_info{};
10018 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
10019 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
10020 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
10021 nullptr, 0, nullptr);
10022 m_errorMonitor->VerifyFound();
10023
10024 vkEndCommandBuffer(bad_command_buffer);
10025 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010026}
10027
Chris Forbes50223732017-05-01 09:43:35 -070010028TEST_F(VkPositiveLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
10029 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ
10030 // in srcAccessMask.
Tony Barbour18ba25c2016-09-29 13:42:40 -060010031
Chris Forbes50223732017-05-01 09:43:35 -070010032 // The required behavior here was a bit unclear in earlier versions of the
10033 // spec, but there is no memory dependency required here, so this should
10034 // work without warnings.
10035
10036 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060010037 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -060010038 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060010039 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 -070010040 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -060010041 ASSERT_TRUE(image.initialized());
10042
10043 VkImageMemoryBarrier barrier = {};
10044 VkImageSubresourceRange range;
10045 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tony Barbour18ba25c2016-09-29 13:42:40 -060010046 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
Chris Forbes50223732017-05-01 09:43:35 -070010047 barrier.dstAccessMask = 0;
Tony Barbour18ba25c2016-09-29 13:42:40 -060010048 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10049 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
10050 barrier.image = image.handle();
10051 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10052 range.baseMipLevel = 0;
10053 range.levelCount = 1;
10054 range.baseArrayLayer = 0;
10055 range.layerCount = 1;
10056 barrier.subresourceRange = range;
10057 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
10058 cmdbuf.BeginCommandBuffer();
10059 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
10060 &barrier);
10061 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
10062 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10063 barrier.srcAccessMask = 0;
10064 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
10065 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
10066 &barrier);
10067
Chris Forbes50223732017-05-01 09:43:35 -070010068 m_errorMonitor->VerifyNotFound();
Tony Barbour18ba25c2016-09-29 13:42:40 -060010069}
10070
Karl Schultz6addd812016-02-02 17:17:23 -070010071TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010072 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -060010073 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010074 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010075
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010076 uint32_t const indices[] = {0};
10077 VkBufferCreateInfo buf_info = {};
10078 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10079 buf_info.size = 1024;
10080 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10081 buf_info.queueFamilyIndexCount = 1;
10082 buf_info.pQueueFamilyIndices = indices;
10083
10084 VkBuffer buffer;
10085 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
10086 ASSERT_VK_SUCCESS(err);
10087
10088 VkMemoryRequirements requirements;
10089 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
10090
10091 VkMemoryAllocateInfo alloc_info{};
10092 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10093 alloc_info.pNext = NULL;
10094 alloc_info.memoryTypeIndex = 0;
10095 alloc_info.allocationSize = requirements.size;
10096 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
10097 ASSERT_TRUE(pass);
10098
10099 VkDeviceMemory memory;
10100 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
10101 ASSERT_VK_SUCCESS(err);
10102
10103 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010104 ASSERT_VK_SUCCESS(err);
10105
Tony Barbour552f6c02016-12-21 14:34:07 -070010106 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010107 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010108
Karl Schultz6addd812016-02-02 17:17:23 -070010109 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10110 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010111 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10113 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010114 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010115
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010116 vkFreeMemory(m_device->device(), memory, NULL);
10117 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010118}
10119
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010120TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10121 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -060010122 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010123 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10124 VkBufferCreateInfo buffCI = {};
10125 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10126 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010127 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010128 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010129 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010130 uint32_t qfi[2];
10131 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010132 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010133
10134 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010135 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010136
10137 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Petr Kraus97291752017-05-11 01:05:16 +020010139 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (= 777) is not one of the queue "
10140 "families given via VkDeviceQueueCreateInfo structures when the device was created.");
Mark Lobodzinski1f9ebb72017-05-11 15:25:51 -060010141 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010142 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010143
10144 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -070010145 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
10147
10148 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
10149 buffCI.queueFamilyIndexCount = 2;
10150 qfi[0] = 1;
10151 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -070010152 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010153 VkDeviceMemory mem;
10154 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -070010155 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010156
10157 VkMemoryAllocateInfo alloc_info = {};
10158 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10159 alloc_info.allocationSize = 1024;
10160 bool pass = false;
10161 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
10162 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -070010163 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010164 return;
10165 }
10166 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -070010167 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010168
10169 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -070010170 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010171 m_commandBuffer->end();
10172 QueueCommandBuffer(false);
10173 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -070010174 vkDestroyBuffer(m_device->device(), ib2, NULL);
10175 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010176 }
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010177}
10178
Karl Schultz6addd812016-02-02 17:17:23 -070010179TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010180 TEST_DESCRIPTION(
10181 "Attempt vkCmdExecuteCommands with a primary command buffer"
10182 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010183
Tony Barbour1fa09702017-03-16 12:09:08 -060010184 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010185 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010186
Chris Forbesf29a84f2016-10-06 18:39:28 +130010187 // An empty primary command buffer
10188 VkCommandBufferObj cb(m_device, m_commandPool);
10189 cb.BeginCommandBuffer();
10190 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010191
Chris Forbesf29a84f2016-10-06 18:39:28 +130010192 m_commandBuffer->BeginCommandBuffer();
10193 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10194 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010195
Chris Forbesf29a84f2016-10-06 18:39:28 +130010196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
10197 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010198 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070010199
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060010200 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010201}
10202
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010203TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010204 TEST_DESCRIPTION(
10205 "Attempt to update descriptor sets for images and buffers "
10206 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010207 VkResult err;
10208
Tony Barbour1fa09702017-03-16 12:09:08 -060010209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010210 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10211 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10212 ds_type_count[i].type = VkDescriptorType(i);
10213 ds_type_count[i].descriptorCount = 1;
10214 }
10215 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10216 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10217 ds_pool_ci.pNext = NULL;
10218 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10219 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10220 ds_pool_ci.pPoolSizes = ds_type_count;
10221
10222 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010223 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010224 ASSERT_VK_SUCCESS(err);
10225
10226 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010227 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010228 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10229 dsl_binding[i].binding = 0;
10230 dsl_binding[i].descriptorType = VkDescriptorType(i);
10231 dsl_binding[i].descriptorCount = 1;
10232 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10233 dsl_binding[i].pImmutableSamplers = NULL;
10234 }
10235
10236 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10237 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10238 ds_layout_ci.pNext = NULL;
10239 ds_layout_ci.bindingCount = 1;
10240 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10241 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10242 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010243 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010244 ASSERT_VK_SUCCESS(err);
10245 }
10246 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10247 VkDescriptorSetAllocateInfo alloc_info = {};
10248 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10249 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10250 alloc_info.descriptorPool = ds_pool;
10251 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010252 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010253 ASSERT_VK_SUCCESS(err);
10254
10255 // Create a buffer & bufferView to be used for invalid updates
10256 VkBufferCreateInfo buff_ci = {};
10257 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -070010258 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010259 buff_ci.size = 256;
10260 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -070010261 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010262 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10263 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -070010264
10265 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
10266 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
10267 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
10268 ASSERT_VK_SUCCESS(err);
10269
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010270 VkMemoryRequirements mem_reqs;
10271 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10272 VkMemoryAllocateInfo mem_alloc_info = {};
10273 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10274 mem_alloc_info.pNext = NULL;
10275 mem_alloc_info.memoryTypeIndex = 0;
10276 mem_alloc_info.allocationSize = mem_reqs.size;
10277 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10278 if (!pass) {
10279 vkDestroyBuffer(m_device->device(), buffer, NULL);
10280 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10281 return;
10282 }
10283 VkDeviceMemory mem;
10284 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
10285 ASSERT_VK_SUCCESS(err);
10286 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10287 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010288
10289 VkBufferViewCreateInfo buff_view_ci = {};
10290 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10291 buff_view_ci.buffer = buffer;
10292 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10293 buff_view_ci.range = VK_WHOLE_SIZE;
10294 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010295 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010296 ASSERT_VK_SUCCESS(err);
10297
Tony Barbour415497c2017-01-24 10:06:09 -070010298 // Now get resources / view for storage_texel_buffer
10299 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
10300 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10301 if (!pass) {
10302 vkDestroyBuffer(m_device->device(), buffer, NULL);
10303 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10304 vkFreeMemory(m_device->device(), mem, NULL);
10305 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
10306 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10307 return;
10308 }
10309 VkDeviceMemory storage_texel_buffer_mem;
10310 VkBufferView storage_texel_buffer_view;
10311 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
10312 ASSERT_VK_SUCCESS(err);
10313 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
10314 ASSERT_VK_SUCCESS(err);
10315 buff_view_ci.buffer = storage_texel_buffer;
10316 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
10317 ASSERT_VK_SUCCESS(err);
10318
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010319 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -070010320 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010321 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -070010322 image_ci.format = VK_FORMAT_UNDEFINED;
10323 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
10324 VkFormat format = static_cast<VkFormat>(f);
10325 VkFormatProperties fProps = m_device->format_properties(format);
10326 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10327 image_ci.format = format;
10328 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10329 break;
10330 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10331 image_ci.format = format;
10332 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
10333 break;
10334 }
10335 }
10336 if (image_ci.format == VK_FORMAT_UNDEFINED) {
10337 return;
10338 }
10339
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010340 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10341 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010342 image_ci.extent.width = 64;
10343 image_ci.extent.height = 64;
10344 image_ci.extent.depth = 1;
10345 image_ci.mipLevels = 1;
10346 image_ci.arrayLayers = 1;
10347 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010348 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010349 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010350 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10351 VkImage image;
10352 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10353 ASSERT_VK_SUCCESS(err);
10354 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010355 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010356
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010357 VkMemoryAllocateInfo mem_alloc = {};
10358 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10359 mem_alloc.pNext = NULL;
10360 mem_alloc.allocationSize = 0;
10361 mem_alloc.memoryTypeIndex = 0;
10362 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10363 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010364 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010365 ASSERT_TRUE(pass);
10366 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10367 ASSERT_VK_SUCCESS(err);
10368 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10369 ASSERT_VK_SUCCESS(err);
10370 // Now create view for image
10371 VkImageViewCreateInfo image_view_ci = {};
10372 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10373 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010374 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010375 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10376 image_view_ci.subresourceRange.layerCount = 1;
10377 image_view_ci.subresourceRange.baseArrayLayer = 0;
10378 image_view_ci.subresourceRange.levelCount = 1;
10379 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10380 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010381 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010382 ASSERT_VK_SUCCESS(err);
10383
10384 VkDescriptorBufferInfo buff_info = {};
10385 buff_info.buffer = buffer;
10386 VkDescriptorImageInfo img_info = {};
10387 img_info.imageView = image_view;
10388 VkWriteDescriptorSet descriptor_write = {};
10389 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10390 descriptor_write.dstBinding = 0;
10391 descriptor_write.descriptorCount = 1;
10392 descriptor_write.pTexelBufferView = &buff_view;
10393 descriptor_write.pBufferInfo = &buff_info;
10394 descriptor_write.pImageInfo = &img_info;
10395
10396 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010397 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010398 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
10399 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
10400 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
10401 VALIDATION_ERROR_00943, // STORAGE_IMAGE
10402 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
10403 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
10404 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
10405 VALIDATION_ERROR_00947, // STORAGE_BUFFER
10406 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
10407 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
10408 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010409 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010410 // Start loop at 1 as SAMPLER desc type has no usage bit error
10411 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -070010412 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10413 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
10414 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
10415 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010416 descriptor_write.descriptorType = VkDescriptorType(i);
10417 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010419
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010420 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010421
10422 m_errorMonitor->VerifyFound();
10423 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010424 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10425 descriptor_write.pTexelBufferView = &buff_view;
10426 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010427 }
Tony Barbour415497c2017-01-24 10:06:09 -070010428
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010429 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10430 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010431 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010432 vkDestroyImageView(m_device->device(), image_view, NULL);
10433 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010434 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010435 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010436 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010437 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010438 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010439 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10440}
10441
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010442TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010443 TEST_DESCRIPTION(
10444 "Attempt to update buffer descriptor set that has incorrect "
10445 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010446 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010447 "2. range value of 0\n"
10448 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010449 VkResult err;
10450
Tony Barbour1fa09702017-03-16 12:09:08 -060010451 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010452 VkDescriptorPoolSize ds_type_count = {};
10453 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10454 ds_type_count.descriptorCount = 1;
10455
10456 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10457 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10458 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010459 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010460 ds_pool_ci.maxSets = 1;
10461 ds_pool_ci.poolSizeCount = 1;
10462 ds_pool_ci.pPoolSizes = &ds_type_count;
10463
10464 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010465 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010466 ASSERT_VK_SUCCESS(err);
10467
10468 // Create layout with single uniform buffer descriptor
10469 VkDescriptorSetLayoutBinding dsl_binding = {};
10470 dsl_binding.binding = 0;
10471 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10472 dsl_binding.descriptorCount = 1;
10473 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10474 dsl_binding.pImmutableSamplers = NULL;
10475
10476 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10477 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10478 ds_layout_ci.pNext = NULL;
10479 ds_layout_ci.bindingCount = 1;
10480 ds_layout_ci.pBindings = &dsl_binding;
10481 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010482 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010483 ASSERT_VK_SUCCESS(err);
10484
10485 VkDescriptorSet descriptor_set = {};
10486 VkDescriptorSetAllocateInfo alloc_info = {};
10487 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10488 alloc_info.descriptorSetCount = 1;
10489 alloc_info.descriptorPool = ds_pool;
10490 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010491 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010492 ASSERT_VK_SUCCESS(err);
10493
10494 // Create a buffer to be used for invalid updates
10495 VkBufferCreateInfo buff_ci = {};
10496 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10497 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010498 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010499 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10500 VkBuffer buffer;
10501 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10502 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010503
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010504 // Have to bind memory to buffer before descriptor update
10505 VkMemoryAllocateInfo mem_alloc = {};
10506 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10507 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010508 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010509 mem_alloc.memoryTypeIndex = 0;
10510
10511 VkMemoryRequirements mem_reqs;
10512 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010513 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010514 if (!pass) {
10515 vkDestroyBuffer(m_device->device(), buffer, NULL);
10516 return;
10517 }
10518
10519 VkDeviceMemory mem;
10520 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10521 ASSERT_VK_SUCCESS(err);
10522 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10523 ASSERT_VK_SUCCESS(err);
10524
10525 VkDescriptorBufferInfo buff_info = {};
10526 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010527 // Cause error due to offset out of range
10528 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010529 buff_info.range = VK_WHOLE_SIZE;
10530 VkWriteDescriptorSet descriptor_write = {};
10531 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10532 descriptor_write.dstBinding = 0;
10533 descriptor_write.descriptorCount = 1;
10534 descriptor_write.pTexelBufferView = nullptr;
10535 descriptor_write.pBufferInfo = &buff_info;
10536 descriptor_write.pImageInfo = nullptr;
10537
10538 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10539 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010541
10542 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10543
10544 m_errorMonitor->VerifyFound();
10545 // Now cause error due to range of 0
10546 buff_info.offset = 0;
10547 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010549
10550 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10551
10552 m_errorMonitor->VerifyFound();
10553 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010554 buff_info.offset = 0;
10555 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010557
10558 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10559
10560 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010561 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010562 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10563 vkDestroyBuffer(m_device->device(), buffer, NULL);
10564 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10565 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10566}
10567
Tobin Ehlis845887e2017-02-02 19:01:44 -070010568TEST_F(VkLayerTest, DSBufferLimitErrors) {
10569 TEST_DESCRIPTION(
10570 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10571 "Test cases include:\n"
10572 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10573 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10574 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10575 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10576 VkResult err;
10577
Tony Barbour1fa09702017-03-16 12:09:08 -060010578 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010579 VkDescriptorPoolSize ds_type_count[2] = {};
10580 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10581 ds_type_count[0].descriptorCount = 1;
10582 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10583 ds_type_count[1].descriptorCount = 1;
10584
10585 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10586 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10587 ds_pool_ci.pNext = NULL;
10588 ds_pool_ci.maxSets = 1;
10589 ds_pool_ci.poolSizeCount = 2;
10590 ds_pool_ci.pPoolSizes = ds_type_count;
10591
10592 VkDescriptorPool ds_pool;
10593 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10594 ASSERT_VK_SUCCESS(err);
10595
10596 // Create layout with single uniform buffer & single storage buffer descriptor
10597 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10598 dsl_binding[0].binding = 0;
10599 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10600 dsl_binding[0].descriptorCount = 1;
10601 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10602 dsl_binding[0].pImmutableSamplers = NULL;
10603 dsl_binding[1].binding = 1;
10604 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10605 dsl_binding[1].descriptorCount = 1;
10606 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10607 dsl_binding[1].pImmutableSamplers = NULL;
10608
10609 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10610 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10611 ds_layout_ci.pNext = NULL;
10612 ds_layout_ci.bindingCount = 2;
10613 ds_layout_ci.pBindings = dsl_binding;
10614 VkDescriptorSetLayout ds_layout;
10615 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10616 ASSERT_VK_SUCCESS(err);
10617
10618 VkDescriptorSet descriptor_set = {};
10619 VkDescriptorSetAllocateInfo alloc_info = {};
10620 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10621 alloc_info.descriptorSetCount = 1;
10622 alloc_info.descriptorPool = ds_pool;
10623 alloc_info.pSetLayouts = &ds_layout;
10624 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10625 ASSERT_VK_SUCCESS(err);
10626
10627 // Create a buffer to be used for invalid updates
10628 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10629 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10630 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10631 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10632 VkBufferCreateInfo ub_ci = {};
10633 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10634 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10635 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10636 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10637 VkBuffer uniform_buffer;
10638 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10639 ASSERT_VK_SUCCESS(err);
10640 VkBufferCreateInfo sb_ci = {};
10641 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10642 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10643 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10644 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10645 VkBuffer storage_buffer;
10646 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10647 ASSERT_VK_SUCCESS(err);
10648 // Have to bind memory to buffer before descriptor update
10649 VkMemoryAllocateInfo mem_alloc = {};
10650 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10651 mem_alloc.pNext = NULL;
10652 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10653 mem_alloc.memoryTypeIndex = 0;
10654
Cort Stratton77a0d592017-02-17 13:14:13 -080010655 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10656 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10657 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10658 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10659 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010660 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010661 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010662 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010663 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10664 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010665 return;
10666 }
10667
10668 VkDeviceMemory mem;
10669 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010670 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010671 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010672 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10673 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10674 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10675 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10676 return;
10677 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010678 ASSERT_VK_SUCCESS(err);
10679 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10680 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010681 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010682 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10683 ASSERT_VK_SUCCESS(err);
10684
10685 VkDescriptorBufferInfo buff_info = {};
10686 buff_info.buffer = uniform_buffer;
10687 buff_info.range = ub_ci.size; // This will exceed limit
10688 VkWriteDescriptorSet descriptor_write = {};
10689 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10690 descriptor_write.dstBinding = 0;
10691 descriptor_write.descriptorCount = 1;
10692 descriptor_write.pTexelBufferView = nullptr;
10693 descriptor_write.pBufferInfo = &buff_info;
10694 descriptor_write.pImageInfo = nullptr;
10695
10696 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10697 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010698 if (max_ub_range != UINT32_MAX) {
10699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10700 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10701 m_errorMonitor->VerifyFound();
10702 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010703 // Reduce size of range to acceptable limit & cause offset error
10704 buff_info.range = max_ub_range;
10705 buff_info.offset = min_ub_align - 1;
10706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10707 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10708 m_errorMonitor->VerifyFound();
10709
10710 // Now break storage updates
10711 buff_info.buffer = storage_buffer;
10712 buff_info.range = sb_ci.size; // This will exceed limit
10713 buff_info.offset = 0; // Reset offset for this update
10714
10715 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10716 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010717 if (max_ub_range != UINT32_MAX) {
10718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10719 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10720 m_errorMonitor->VerifyFound();
10721 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010722
10723 // Reduce size of range to acceptable limit & cause offset error
10724 buff_info.range = max_sb_range;
10725 buff_info.offset = min_sb_align - 1;
10726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10727 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10728 m_errorMonitor->VerifyFound();
10729
10730 vkFreeMemory(m_device->device(), mem, NULL);
10731 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10732 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10733 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10734 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10735}
10736
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010737TEST_F(VkLayerTest, DSAspectBitsErrors) {
10738 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10739 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010740 TEST_DESCRIPTION(
10741 "Attempt to update descriptor sets for images "
10742 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010743 VkResult err;
10744
Tony Barbour1fa09702017-03-16 12:09:08 -060010745 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010746 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010747 if (!depth_format) {
10748 printf(" No Depth + Stencil format found. Skipped.\n");
10749 return;
10750 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010751 VkDescriptorPoolSize ds_type_count = {};
10752 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10753 ds_type_count.descriptorCount = 1;
10754
10755 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10756 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10757 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010758 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010759 ds_pool_ci.maxSets = 5;
10760 ds_pool_ci.poolSizeCount = 1;
10761 ds_pool_ci.pPoolSizes = &ds_type_count;
10762
10763 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010764 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010765 ASSERT_VK_SUCCESS(err);
10766
10767 VkDescriptorSetLayoutBinding dsl_binding = {};
10768 dsl_binding.binding = 0;
10769 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10770 dsl_binding.descriptorCount = 1;
10771 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10772 dsl_binding.pImmutableSamplers = NULL;
10773
10774 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10775 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10776 ds_layout_ci.pNext = NULL;
10777 ds_layout_ci.bindingCount = 1;
10778 ds_layout_ci.pBindings = &dsl_binding;
10779 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010780 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010781 ASSERT_VK_SUCCESS(err);
10782
10783 VkDescriptorSet descriptor_set = {};
10784 VkDescriptorSetAllocateInfo alloc_info = {};
10785 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10786 alloc_info.descriptorSetCount = 1;
10787 alloc_info.descriptorPool = ds_pool;
10788 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010789 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010790 ASSERT_VK_SUCCESS(err);
10791
10792 // Create an image to be used for invalid updates
10793 VkImageCreateInfo image_ci = {};
10794 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10795 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010796 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010797 image_ci.extent.width = 64;
10798 image_ci.extent.height = 64;
10799 image_ci.extent.depth = 1;
10800 image_ci.mipLevels = 1;
10801 image_ci.arrayLayers = 1;
10802 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010803 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010804 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10805 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10806 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10807 VkImage image;
10808 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10809 ASSERT_VK_SUCCESS(err);
10810 // Bind memory to image
10811 VkMemoryRequirements mem_reqs;
10812 VkDeviceMemory image_mem;
10813 bool pass;
10814 VkMemoryAllocateInfo mem_alloc = {};
10815 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10816 mem_alloc.pNext = NULL;
10817 mem_alloc.allocationSize = 0;
10818 mem_alloc.memoryTypeIndex = 0;
10819 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10820 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010821 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010822 ASSERT_TRUE(pass);
10823 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10824 ASSERT_VK_SUCCESS(err);
10825 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10826 ASSERT_VK_SUCCESS(err);
10827 // Now create view for image
10828 VkImageViewCreateInfo image_view_ci = {};
10829 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10830 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010831 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010832 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10833 image_view_ci.subresourceRange.layerCount = 1;
10834 image_view_ci.subresourceRange.baseArrayLayer = 0;
10835 image_view_ci.subresourceRange.levelCount = 1;
10836 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010837 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010838
10839 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010840 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010841 ASSERT_VK_SUCCESS(err);
10842
10843 VkDescriptorImageInfo img_info = {};
10844 img_info.imageView = image_view;
10845 VkWriteDescriptorSet descriptor_write = {};
10846 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10847 descriptor_write.dstBinding = 0;
10848 descriptor_write.descriptorCount = 1;
10849 descriptor_write.pTexelBufferView = NULL;
10850 descriptor_write.pBufferInfo = NULL;
10851 descriptor_write.pImageInfo = &img_info;
10852 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10853 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010854 const char *error_msg =
10855 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10856 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010858
10859 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10860
10861 m_errorMonitor->VerifyFound();
10862 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10863 vkDestroyImage(m_device->device(), image, NULL);
10864 vkFreeMemory(m_device->device(), image_mem, NULL);
10865 vkDestroyImageView(m_device->device(), image_view, NULL);
10866 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10867 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10868}
10869
Karl Schultz6addd812016-02-02 17:17:23 -070010870TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010871 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010872 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010873
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10875 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10876 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010877
Tony Barbour1fa09702017-03-16 12:09:08 -060010878 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010879 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010880 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010881 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10882 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010883
10884 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010885 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10886 ds_pool_ci.pNext = NULL;
10887 ds_pool_ci.maxSets = 1;
10888 ds_pool_ci.poolSizeCount = 1;
10889 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010890
Tobin Ehlis3b780662015-05-28 12:11:26 -060010891 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010892 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010893 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010894 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010895 dsl_binding.binding = 0;
10896 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10897 dsl_binding.descriptorCount = 1;
10898 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10899 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010900
Tony Barboureb254902015-07-15 12:50:33 -060010901 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010902 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10903 ds_layout_ci.pNext = NULL;
10904 ds_layout_ci.bindingCount = 1;
10905 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010906
Tobin Ehlis3b780662015-05-28 12:11:26 -060010907 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010908 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010909 ASSERT_VK_SUCCESS(err);
10910
10911 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010912 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010913 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010914 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010915 alloc_info.descriptorPool = ds_pool;
10916 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010917 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010918 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010919
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010920 VkSamplerCreateInfo sampler_ci = {};
10921 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10922 sampler_ci.pNext = NULL;
10923 sampler_ci.magFilter = VK_FILTER_NEAREST;
10924 sampler_ci.minFilter = VK_FILTER_NEAREST;
10925 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10926 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10927 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10928 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10929 sampler_ci.mipLodBias = 1.0;
10930 sampler_ci.anisotropyEnable = VK_FALSE;
10931 sampler_ci.maxAnisotropy = 1;
10932 sampler_ci.compareEnable = VK_FALSE;
10933 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10934 sampler_ci.minLod = 1.0;
10935 sampler_ci.maxLod = 1.0;
10936 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10937 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10938 VkSampler sampler;
10939 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10940 ASSERT_VK_SUCCESS(err);
10941
10942 VkDescriptorImageInfo info = {};
10943 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010944
10945 VkWriteDescriptorSet descriptor_write;
10946 memset(&descriptor_write, 0, sizeof(descriptor_write));
10947 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010948 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010949 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010950 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010951 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010952 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010953
10954 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10955
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010956 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010957
Chia-I Wuf7458c52015-10-26 21:10:41 +080010958 vkDestroySampler(m_device->device(), sampler, NULL);
10959 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10960 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010961}
10962
Karl Schultz6addd812016-02-02 17:17:23 -070010963TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010964 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010965 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010966
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010968
Tony Barbour1fa09702017-03-16 12:09:08 -060010969 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010970 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010971 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010972 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10973 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010974
10975 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010976 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10977 ds_pool_ci.pNext = NULL;
10978 ds_pool_ci.maxSets = 1;
10979 ds_pool_ci.poolSizeCount = 1;
10980 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010981
Tobin Ehlis3b780662015-05-28 12:11:26 -060010982 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010983 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010984 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010985
Tony Barboureb254902015-07-15 12:50:33 -060010986 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010987 dsl_binding.binding = 0;
10988 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10989 dsl_binding.descriptorCount = 1;
10990 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10991 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010992
10993 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010994 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10995 ds_layout_ci.pNext = NULL;
10996 ds_layout_ci.bindingCount = 1;
10997 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010998
Tobin Ehlis3b780662015-05-28 12:11:26 -060010999 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011000 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011001 ASSERT_VK_SUCCESS(err);
11002
11003 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011004 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011005 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011006 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011007 alloc_info.descriptorPool = ds_pool;
11008 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011009 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011010 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011011
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070011012 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
11013
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011014 // Correctly update descriptor to avoid "NOT_UPDATED" error
11015 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070011016 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011017 buff_info.offset = 0;
11018 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011019
11020 VkWriteDescriptorSet descriptor_write;
11021 memset(&descriptor_write, 0, sizeof(descriptor_write));
11022 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011023 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011024 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080011025 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011026 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11027 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011028
11029 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11030
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011031 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011032
Chia-I Wuf7458c52015-10-26 21:10:41 +080011033 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11034 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011035}
11036
Karl Schultz6addd812016-02-02 17:17:23 -070011037TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070011038 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070011039 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011040
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070011041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011042
Tony Barbour1fa09702017-03-16 12:09:08 -060011043 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011044 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011045 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011046 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11047 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011048
11049 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011050 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11051 ds_pool_ci.pNext = NULL;
11052 ds_pool_ci.maxSets = 1;
11053 ds_pool_ci.poolSizeCount = 1;
11054 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011055
Tobin Ehlis3b780662015-05-28 12:11:26 -060011056 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011057 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011058 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011059
Tony Barboureb254902015-07-15 12:50:33 -060011060 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011061 dsl_binding.binding = 0;
11062 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11063 dsl_binding.descriptorCount = 1;
11064 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11065 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011066
11067 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011068 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11069 ds_layout_ci.pNext = NULL;
11070 ds_layout_ci.bindingCount = 1;
11071 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011072 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011073 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011074 ASSERT_VK_SUCCESS(err);
11075
11076 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011077 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011078 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011079 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011080 alloc_info.descriptorPool = ds_pool;
11081 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011082 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011083 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011084
Tony Barboureb254902015-07-15 12:50:33 -060011085 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011086 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11087 sampler_ci.pNext = NULL;
11088 sampler_ci.magFilter = VK_FILTER_NEAREST;
11089 sampler_ci.minFilter = VK_FILTER_NEAREST;
11090 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11091 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11092 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11093 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11094 sampler_ci.mipLodBias = 1.0;
11095 sampler_ci.anisotropyEnable = VK_FALSE;
11096 sampler_ci.maxAnisotropy = 1;
11097 sampler_ci.compareEnable = VK_FALSE;
11098 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11099 sampler_ci.minLod = 1.0;
11100 sampler_ci.maxLod = 1.0;
11101 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11102 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011103
Tobin Ehlis3b780662015-05-28 12:11:26 -060011104 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011105 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011106 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011107
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011108 VkDescriptorImageInfo info = {};
11109 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011110
11111 VkWriteDescriptorSet descriptor_write;
11112 memset(&descriptor_write, 0, sizeof(descriptor_write));
11113 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011114 descriptor_write.dstSet = descriptorSet;
11115 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011116 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011117 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011118 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011119 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011120
11121 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11122
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011123 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011124
Chia-I Wuf7458c52015-10-26 21:10:41 +080011125 vkDestroySampler(m_device->device(), sampler, NULL);
11126 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11127 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011128}
11129
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011130TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
11131 // Create layout w/ empty binding and attempt to update it
11132 VkResult err;
11133
Tony Barbour1fa09702017-03-16 12:09:08 -060011134 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011135
11136 VkDescriptorPoolSize ds_type_count = {};
11137 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11138 ds_type_count.descriptorCount = 1;
11139
11140 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11141 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11142 ds_pool_ci.pNext = NULL;
11143 ds_pool_ci.maxSets = 1;
11144 ds_pool_ci.poolSizeCount = 1;
11145 ds_pool_ci.pPoolSizes = &ds_type_count;
11146
11147 VkDescriptorPool ds_pool;
11148 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11149 ASSERT_VK_SUCCESS(err);
11150
11151 VkDescriptorSetLayoutBinding dsl_binding = {};
11152 dsl_binding.binding = 0;
11153 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11154 dsl_binding.descriptorCount = 0;
11155 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11156 dsl_binding.pImmutableSamplers = NULL;
11157
11158 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11159 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11160 ds_layout_ci.pNext = NULL;
11161 ds_layout_ci.bindingCount = 1;
11162 ds_layout_ci.pBindings = &dsl_binding;
11163 VkDescriptorSetLayout ds_layout;
11164 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11165 ASSERT_VK_SUCCESS(err);
11166
11167 VkDescriptorSet descriptor_set;
11168 VkDescriptorSetAllocateInfo alloc_info = {};
11169 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11170 alloc_info.descriptorSetCount = 1;
11171 alloc_info.descriptorPool = ds_pool;
11172 alloc_info.pSetLayouts = &ds_layout;
11173 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11174 ASSERT_VK_SUCCESS(err);
11175
11176 VkSamplerCreateInfo sampler_ci = {};
11177 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11178 sampler_ci.magFilter = VK_FILTER_NEAREST;
11179 sampler_ci.minFilter = VK_FILTER_NEAREST;
11180 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11181 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11182 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11183 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11184 sampler_ci.mipLodBias = 1.0;
11185 sampler_ci.maxAnisotropy = 1;
11186 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11187 sampler_ci.minLod = 1.0;
11188 sampler_ci.maxLod = 1.0;
11189 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11190
11191 VkSampler sampler;
11192 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11193 ASSERT_VK_SUCCESS(err);
11194
11195 VkDescriptorImageInfo info = {};
11196 info.sampler = sampler;
11197
11198 VkWriteDescriptorSet descriptor_write;
11199 memset(&descriptor_write, 0, sizeof(descriptor_write));
11200 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11201 descriptor_write.dstSet = descriptor_set;
11202 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011203 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011204 // This is the wrong type, but empty binding error will be flagged first
11205 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11206 descriptor_write.pImageInfo = &info;
11207
11208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
11209 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11210 m_errorMonitor->VerifyFound();
11211
11212 vkDestroySampler(m_device->device(), sampler, NULL);
11213 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11214 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11215}
11216
Karl Schultz6addd812016-02-02 17:17:23 -070011217TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11218 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11219 // types
11220 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011221
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011222 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 -060011223
Tony Barbour1fa09702017-03-16 12:09:08 -060011224 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011225
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011226 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011227 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11228 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011229
11230 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011231 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11232 ds_pool_ci.pNext = NULL;
11233 ds_pool_ci.maxSets = 1;
11234 ds_pool_ci.poolSizeCount = 1;
11235 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011236
Tobin Ehlis3b780662015-05-28 12:11:26 -060011237 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011238 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011239 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011240 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011241 dsl_binding.binding = 0;
11242 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11243 dsl_binding.descriptorCount = 1;
11244 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11245 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011246
Tony Barboureb254902015-07-15 12:50:33 -060011247 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011248 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11249 ds_layout_ci.pNext = NULL;
11250 ds_layout_ci.bindingCount = 1;
11251 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011252
Tobin Ehlis3b780662015-05-28 12:11:26 -060011253 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011254 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011255 ASSERT_VK_SUCCESS(err);
11256
11257 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011258 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011259 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011260 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011261 alloc_info.descriptorPool = ds_pool;
11262 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011263 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011264 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011265
Tony Barboureb254902015-07-15 12:50:33 -060011266 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011267 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11268 sampler_ci.pNext = NULL;
11269 sampler_ci.magFilter = VK_FILTER_NEAREST;
11270 sampler_ci.minFilter = VK_FILTER_NEAREST;
11271 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11272 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11273 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11274 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11275 sampler_ci.mipLodBias = 1.0;
11276 sampler_ci.anisotropyEnable = VK_FALSE;
11277 sampler_ci.maxAnisotropy = 1;
11278 sampler_ci.compareEnable = VK_FALSE;
11279 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11280 sampler_ci.minLod = 1.0;
11281 sampler_ci.maxLod = 1.0;
11282 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11283 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011284 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011285 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011286 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011287
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011288 VkDescriptorImageInfo info = {};
11289 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011290
11291 VkWriteDescriptorSet descriptor_write;
11292 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011293 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011294 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011295 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011296 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011297 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011298 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011299
11300 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11301
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011302 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011303
Chia-I Wuf7458c52015-10-26 21:10:41 +080011304 vkDestroySampler(m_device->device(), sampler, NULL);
11305 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11306 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011307}
11308
Karl Schultz6addd812016-02-02 17:17:23 -070011309TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011310 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011311 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011312
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011314
Tony Barbour1fa09702017-03-16 12:09:08 -060011315 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011316 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11317 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011318 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011319 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11320 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011321
11322 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011323 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11324 ds_pool_ci.pNext = NULL;
11325 ds_pool_ci.maxSets = 1;
11326 ds_pool_ci.poolSizeCount = 1;
11327 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011328
11329 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011330 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011331 ASSERT_VK_SUCCESS(err);
11332
11333 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011334 dsl_binding.binding = 0;
11335 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11336 dsl_binding.descriptorCount = 1;
11337 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11338 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011339
11340 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011341 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11342 ds_layout_ci.pNext = NULL;
11343 ds_layout_ci.bindingCount = 1;
11344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011345 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011346 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011347 ASSERT_VK_SUCCESS(err);
11348
11349 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011350 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011351 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011352 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011353 alloc_info.descriptorPool = ds_pool;
11354 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011355 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011356 ASSERT_VK_SUCCESS(err);
11357
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011358 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011359
11360 VkDescriptorImageInfo descriptor_info;
11361 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11362 descriptor_info.sampler = sampler;
11363
11364 VkWriteDescriptorSet descriptor_write;
11365 memset(&descriptor_write, 0, sizeof(descriptor_write));
11366 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011367 descriptor_write.dstSet = descriptorSet;
11368 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011369 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011370 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11371 descriptor_write.pImageInfo = &descriptor_info;
11372
11373 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11374
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011375 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011376
Chia-I Wuf7458c52015-10-26 21:10:41 +080011377 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11378 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011379}
11380
Karl Schultz6addd812016-02-02 17:17:23 -070011381TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11382 // Create a single combined Image/Sampler descriptor and send it an invalid
11383 // imageView
11384 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011385
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011387
Tony Barbour1fa09702017-03-16 12:09:08 -060011388 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011389 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011390 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11391 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011392
11393 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011394 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11395 ds_pool_ci.pNext = NULL;
11396 ds_pool_ci.maxSets = 1;
11397 ds_pool_ci.poolSizeCount = 1;
11398 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011399
11400 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011401 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011402 ASSERT_VK_SUCCESS(err);
11403
11404 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011405 dsl_binding.binding = 0;
11406 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11407 dsl_binding.descriptorCount = 1;
11408 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11409 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011410
11411 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011412 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11413 ds_layout_ci.pNext = NULL;
11414 ds_layout_ci.bindingCount = 1;
11415 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011416 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011417 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011418 ASSERT_VK_SUCCESS(err);
11419
11420 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011421 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011422 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011423 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011424 alloc_info.descriptorPool = ds_pool;
11425 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011426 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011427 ASSERT_VK_SUCCESS(err);
11428
11429 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011430 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11431 sampler_ci.pNext = NULL;
11432 sampler_ci.magFilter = VK_FILTER_NEAREST;
11433 sampler_ci.minFilter = VK_FILTER_NEAREST;
11434 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11435 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11436 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11437 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11438 sampler_ci.mipLodBias = 1.0;
11439 sampler_ci.anisotropyEnable = VK_FALSE;
11440 sampler_ci.maxAnisotropy = 1;
11441 sampler_ci.compareEnable = VK_FALSE;
11442 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11443 sampler_ci.minLod = 1.0;
11444 sampler_ci.maxLod = 1.0;
11445 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11446 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011447
11448 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011449 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011450 ASSERT_VK_SUCCESS(err);
11451
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011452 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011453
11454 VkDescriptorImageInfo descriptor_info;
11455 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11456 descriptor_info.sampler = sampler;
11457 descriptor_info.imageView = view;
11458
11459 VkWriteDescriptorSet descriptor_write;
11460 memset(&descriptor_write, 0, sizeof(descriptor_write));
11461 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011462 descriptor_write.dstSet = descriptorSet;
11463 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011464 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011465 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11466 descriptor_write.pImageInfo = &descriptor_info;
11467
11468 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11469
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011470 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011471
Chia-I Wuf7458c52015-10-26 21:10:41 +080011472 vkDestroySampler(m_device->device(), sampler, NULL);
11473 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11474 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011475}
11476
Karl Schultz6addd812016-02-02 17:17:23 -070011477TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11478 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11479 // into the other
11480 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011481
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11483 " binding #1 with type "
11484 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11485 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011486
Tony Barbour1fa09702017-03-16 12:09:08 -060011487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011488 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011489 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011490 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11491 ds_type_count[0].descriptorCount = 1;
11492 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11493 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011494
11495 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011496 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11497 ds_pool_ci.pNext = NULL;
11498 ds_pool_ci.maxSets = 1;
11499 ds_pool_ci.poolSizeCount = 2;
11500 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011501
11502 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011503 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011504 ASSERT_VK_SUCCESS(err);
11505 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011506 dsl_binding[0].binding = 0;
11507 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11508 dsl_binding[0].descriptorCount = 1;
11509 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11510 dsl_binding[0].pImmutableSamplers = NULL;
11511 dsl_binding[1].binding = 1;
11512 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11513 dsl_binding[1].descriptorCount = 1;
11514 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11515 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011516
11517 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011518 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11519 ds_layout_ci.pNext = NULL;
11520 ds_layout_ci.bindingCount = 2;
11521 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011522
11523 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011524 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011525 ASSERT_VK_SUCCESS(err);
11526
11527 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011528 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011529 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011530 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011531 alloc_info.descriptorPool = ds_pool;
11532 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011533 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011534 ASSERT_VK_SUCCESS(err);
11535
11536 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011537 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11538 sampler_ci.pNext = NULL;
11539 sampler_ci.magFilter = VK_FILTER_NEAREST;
11540 sampler_ci.minFilter = VK_FILTER_NEAREST;
11541 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11542 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11543 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11544 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11545 sampler_ci.mipLodBias = 1.0;
11546 sampler_ci.anisotropyEnable = VK_FALSE;
11547 sampler_ci.maxAnisotropy = 1;
11548 sampler_ci.compareEnable = VK_FALSE;
11549 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11550 sampler_ci.minLod = 1.0;
11551 sampler_ci.maxLod = 1.0;
11552 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11553 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011554
11555 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011556 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011557 ASSERT_VK_SUCCESS(err);
11558
11559 VkDescriptorImageInfo info = {};
11560 info.sampler = sampler;
11561
11562 VkWriteDescriptorSet descriptor_write;
11563 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11564 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011565 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011566 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011567 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011568 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11569 descriptor_write.pImageInfo = &info;
11570 // This write update should succeed
11571 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11572 // Now perform a copy update that fails due to type mismatch
11573 VkCopyDescriptorSet copy_ds_update;
11574 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11575 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11576 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011577 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011578 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011579 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11580 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011581 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11582
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011583 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011584 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011585 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 -060011586 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11587 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11588 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011589 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011590 copy_ds_update.dstSet = descriptorSet;
11591 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011592 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011593 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11594
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011595 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011596
Tobin Ehlis04356f92015-10-27 16:35:27 -060011597 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11599 " binding#1 with offset index of 1 plus "
11600 "update array offset of 0 and update of "
11601 "5 descriptors oversteps total number "
11602 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011603
Tobin Ehlis04356f92015-10-27 16:35:27 -060011604 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11605 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11606 copy_ds_update.srcSet = descriptorSet;
11607 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011608 copy_ds_update.dstSet = descriptorSet;
11609 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011610 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011611 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11612
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011613 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011614
Chia-I Wuf7458c52015-10-26 21:10:41 +080011615 vkDestroySampler(m_device->device(), sampler, NULL);
11616 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11617 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011618}
11619
Karl Schultz6addd812016-02-02 17:17:23 -070011620TEST_F(VkLayerTest, NumSamplesMismatch) {
11621 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11622 // sampleCount
11623 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011624
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011626
Tony Barbour1fa09702017-03-16 12:09:08 -060011627 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011628 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011629 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011630 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011631 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011632
11633 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011634 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11635 ds_pool_ci.pNext = NULL;
11636 ds_pool_ci.maxSets = 1;
11637 ds_pool_ci.poolSizeCount = 1;
11638 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011639
Tobin Ehlis3b780662015-05-28 12:11:26 -060011640 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011641 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011642 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011643
Tony Barboureb254902015-07-15 12:50:33 -060011644 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011645 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011646 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011647 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011648 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11649 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011650
Tony Barboureb254902015-07-15 12:50:33 -060011651 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11652 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11653 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011654 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011655 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011656
Tobin Ehlis3b780662015-05-28 12:11:26 -060011657 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011658 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011659 ASSERT_VK_SUCCESS(err);
11660
11661 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011662 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011663 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011664 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011665 alloc_info.descriptorPool = ds_pool;
11666 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011667 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011668 ASSERT_VK_SUCCESS(err);
11669
Tony Barboureb254902015-07-15 12:50:33 -060011670 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011671 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011672 pipe_ms_state_ci.pNext = NULL;
11673 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11674 pipe_ms_state_ci.sampleShadingEnable = 0;
11675 pipe_ms_state_ci.minSampleShading = 1.0;
11676 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011677
Tony Barboureb254902015-07-15 12:50:33 -060011678 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011679 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11680 pipeline_layout_ci.pNext = NULL;
11681 pipeline_layout_ci.setLayoutCount = 1;
11682 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011683
11684 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011685 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011686 ASSERT_VK_SUCCESS(err);
11687
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011688 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011689 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 -060011690 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011691 VkPipelineObj pipe(m_device);
11692 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011693 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011694 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011695 pipe.SetMSAA(&pipe_ms_state_ci);
11696 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011697
Tony Barbour552f6c02016-12-21 14:34:07 -070011698 m_commandBuffer->BeginCommandBuffer();
11699 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011700 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011701
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011702 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11703 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11704 VkRect2D scissor = {{0, 0}, {16, 16}};
11705 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11706
Mark Young29927482016-05-04 14:38:51 -060011707 // Render triangle (the error should trigger on the attempt to draw).
11708 Draw(3, 1, 0, 0);
11709
11710 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011711 m_commandBuffer->EndRenderPass();
11712 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011713
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011714 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011715
Chia-I Wuf7458c52015-10-26 21:10:41 +080011716 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11717 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11718 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011719}
Mark Young29927482016-05-04 14:38:51 -060011720
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011721TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011722 TEST_DESCRIPTION(
11723 "Hit RenderPass incompatible cases. "
11724 "Initial case is drawing with an active renderpass that's "
11725 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011726 VkResult err;
11727
Tony Barbour1fa09702017-03-16 12:09:08 -060011728 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011729 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11730
11731 VkDescriptorSetLayoutBinding dsl_binding = {};
11732 dsl_binding.binding = 0;
11733 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11734 dsl_binding.descriptorCount = 1;
11735 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11736 dsl_binding.pImmutableSamplers = NULL;
11737
11738 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11739 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11740 ds_layout_ci.pNext = NULL;
11741 ds_layout_ci.bindingCount = 1;
11742 ds_layout_ci.pBindings = &dsl_binding;
11743
11744 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011745 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011746 ASSERT_VK_SUCCESS(err);
11747
11748 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11749 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11750 pipeline_layout_ci.pNext = NULL;
11751 pipeline_layout_ci.setLayoutCount = 1;
11752 pipeline_layout_ci.pSetLayouts = &ds_layout;
11753
11754 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011755 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011756 ASSERT_VK_SUCCESS(err);
11757
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011758 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011759 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 -060011760 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011761 // Create a renderpass that will be incompatible with default renderpass
11762 VkAttachmentReference attach = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011763 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011764 VkAttachmentReference color_att = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011765 color_att.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011766 VkSubpassDescription subpass = {};
11767 subpass.inputAttachmentCount = 1;
11768 subpass.pInputAttachments = &attach;
11769 subpass.colorAttachmentCount = 1;
11770 subpass.pColorAttachments = &color_att;
11771 VkRenderPassCreateInfo rpci = {};
11772 rpci.subpassCount = 1;
11773 rpci.pSubpasses = &subpass;
11774 rpci.attachmentCount = 1;
11775 VkAttachmentDescription attach_desc = {};
11776 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011777 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11778 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011779 rpci.pAttachments = &attach_desc;
11780 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11781 VkRenderPass rp;
11782 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11783 VkPipelineObj pipe(m_device);
11784 pipe.AddShader(&vs);
11785 pipe.AddShader(&fs);
11786 pipe.AddColorAttachment();
11787 VkViewport view_port = {};
11788 m_viewports.push_back(view_port);
11789 pipe.SetViewport(m_viewports);
11790 VkRect2D rect = {};
11791 m_scissors.push_back(rect);
11792 pipe.SetScissor(m_scissors);
11793 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11794
11795 VkCommandBufferInheritanceInfo cbii = {};
11796 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11797 cbii.renderPass = rp;
11798 cbii.subpass = 0;
11799 VkCommandBufferBeginInfo cbbi = {};
11800 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11801 cbbi.pInheritanceInfo = &cbii;
11802 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11803 VkRenderPassBeginInfo rpbi = {};
11804 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11805 rpbi.framebuffer = m_framebuffer;
11806 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011807 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11808 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011809
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011811 // Render triangle (the error should trigger on the attempt to draw).
11812 Draw(3, 1, 0, 0);
11813
11814 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011815 m_commandBuffer->EndRenderPass();
11816 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011817
11818 m_errorMonitor->VerifyFound();
11819
11820 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11821 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11822 vkDestroyRenderPass(m_device->device(), rp, NULL);
11823}
11824
Mark Youngc89c6312016-03-31 16:03:20 -060011825TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11826 // Create Pipeline where the number of blend attachments doesn't match the
11827 // number of color attachments. In this case, we don't add any color
11828 // blend attachments even though we have a color attachment.
11829 VkResult err;
11830
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011832
Tony Barbour1fa09702017-03-16 12:09:08 -060011833 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011834 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11835 VkDescriptorPoolSize ds_type_count = {};
11836 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11837 ds_type_count.descriptorCount = 1;
11838
11839 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11840 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11841 ds_pool_ci.pNext = NULL;
11842 ds_pool_ci.maxSets = 1;
11843 ds_pool_ci.poolSizeCount = 1;
11844 ds_pool_ci.pPoolSizes = &ds_type_count;
11845
11846 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011847 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011848 ASSERT_VK_SUCCESS(err);
11849
11850 VkDescriptorSetLayoutBinding dsl_binding = {};
11851 dsl_binding.binding = 0;
11852 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11853 dsl_binding.descriptorCount = 1;
11854 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11855 dsl_binding.pImmutableSamplers = NULL;
11856
11857 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11858 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11859 ds_layout_ci.pNext = NULL;
11860 ds_layout_ci.bindingCount = 1;
11861 ds_layout_ci.pBindings = &dsl_binding;
11862
11863 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011864 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011865 ASSERT_VK_SUCCESS(err);
11866
11867 VkDescriptorSet descriptorSet;
11868 VkDescriptorSetAllocateInfo alloc_info = {};
11869 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11870 alloc_info.descriptorSetCount = 1;
11871 alloc_info.descriptorPool = ds_pool;
11872 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011873 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011874 ASSERT_VK_SUCCESS(err);
11875
11876 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011877 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011878 pipe_ms_state_ci.pNext = NULL;
11879 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11880 pipe_ms_state_ci.sampleShadingEnable = 0;
11881 pipe_ms_state_ci.minSampleShading = 1.0;
11882 pipe_ms_state_ci.pSampleMask = NULL;
11883
11884 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11885 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11886 pipeline_layout_ci.pNext = NULL;
11887 pipeline_layout_ci.setLayoutCount = 1;
11888 pipeline_layout_ci.pSetLayouts = &ds_layout;
11889
11890 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011891 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011892 ASSERT_VK_SUCCESS(err);
11893
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011894 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011895 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 -060011896 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011897 VkPipelineObj pipe(m_device);
11898 pipe.AddShader(&vs);
11899 pipe.AddShader(&fs);
11900 pipe.SetMSAA(&pipe_ms_state_ci);
11901 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011902 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011903
11904 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11905 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11906 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11907}
Mark Young29927482016-05-04 14:38:51 -060011908
Mark Muellerd4914412016-06-13 17:52:06 -060011909TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011910 TEST_DESCRIPTION(
11911 "Points to a wrong colorAttachment index in a VkClearAttachment "
11912 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011913 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011915
11916 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11917 m_errorMonitor->VerifyFound();
11918}
11919
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011920TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011921 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11922 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011923
Tony Barbour1fa09702017-03-16 12:09:08 -060011924 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011925 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011926
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011927 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011928 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11929 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011930
11931 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011932 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11933 ds_pool_ci.pNext = NULL;
11934 ds_pool_ci.maxSets = 1;
11935 ds_pool_ci.poolSizeCount = 1;
11936 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011937
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011938 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011939 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011940 ASSERT_VK_SUCCESS(err);
11941
Tony Barboureb254902015-07-15 12:50:33 -060011942 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011943 dsl_binding.binding = 0;
11944 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11945 dsl_binding.descriptorCount = 1;
11946 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11947 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011948
Tony Barboureb254902015-07-15 12:50:33 -060011949 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011950 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11951 ds_layout_ci.pNext = NULL;
11952 ds_layout_ci.bindingCount = 1;
11953 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011954
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011955 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011956 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011957 ASSERT_VK_SUCCESS(err);
11958
11959 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011960 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011961 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011962 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011963 alloc_info.descriptorPool = ds_pool;
11964 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011965 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011966 ASSERT_VK_SUCCESS(err);
11967
Tony Barboureb254902015-07-15 12:50:33 -060011968 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011969 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011970 pipe_ms_state_ci.pNext = NULL;
11971 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11972 pipe_ms_state_ci.sampleShadingEnable = 0;
11973 pipe_ms_state_ci.minSampleShading = 1.0;
11974 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011975
Tony Barboureb254902015-07-15 12:50:33 -060011976 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011977 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11978 pipeline_layout_ci.pNext = NULL;
11979 pipeline_layout_ci.setLayoutCount = 1;
11980 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011981
11982 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011983 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011984 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011985
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011986 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011987 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011988 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011989 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011990
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011991 VkPipelineObj pipe(m_device);
11992 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011993 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011994 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011995 pipe.SetMSAA(&pipe_ms_state_ci);
11996 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011997
Tony Barbour552f6c02016-12-21 14:34:07 -070011998 m_commandBuffer->BeginCommandBuffer();
11999 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012000
Karl Schultz6addd812016-02-02 17:17:23 -070012001 // Main thing we care about for this test is that the VkImage obj we're
12002 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012003 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060012004 VkClearAttachment color_attachment;
12005 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12006 color_attachment.clearValue.color.float32[0] = 1.0;
12007 color_attachment.clearValue.color.float32[1] = 1.0;
12008 color_attachment.clearValue.color.float32[2] = 1.0;
12009 color_attachment.clearValue.color.float32[3] = 1.0;
12010 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012011 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012012
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070012013 // Call for full-sized FB Color attachment prior to issuing a Draw
12014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012015 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012016 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070012017 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012018
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070012019 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
12020 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
12021 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
12022 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
12023 m_errorMonitor->VerifyFound();
12024
12025 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
12026 clear_rect.layerCount = 2;
12027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
12028 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012029 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012030
Chia-I Wuf7458c52015-10-26 21:10:41 +080012031 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12032 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12033 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012034}
12035
Karl Schultz6addd812016-02-02 17:17:23 -070012036TEST_F(VkLayerTest, VtxBufferBadIndex) {
12037 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012038
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12040 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012041
Tony Barbour1fa09702017-03-16 12:09:08 -060012042 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060012043 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060012044 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012045
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012046 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012047 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12048 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012049
12050 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012051 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12052 ds_pool_ci.pNext = NULL;
12053 ds_pool_ci.maxSets = 1;
12054 ds_pool_ci.poolSizeCount = 1;
12055 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012056
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012057 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012058 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012059 ASSERT_VK_SUCCESS(err);
12060
Tony Barboureb254902015-07-15 12:50:33 -060012061 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012062 dsl_binding.binding = 0;
12063 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12064 dsl_binding.descriptorCount = 1;
12065 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12066 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012067
Tony Barboureb254902015-07-15 12:50:33 -060012068 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012069 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12070 ds_layout_ci.pNext = NULL;
12071 ds_layout_ci.bindingCount = 1;
12072 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012073
Tobin Ehlis502480b2015-06-24 15:53:07 -060012074 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012075 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012076 ASSERT_VK_SUCCESS(err);
12077
12078 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012079 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012080 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012081 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012082 alloc_info.descriptorPool = ds_pool;
12083 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012084 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012085 ASSERT_VK_SUCCESS(err);
12086
Tony Barboureb254902015-07-15 12:50:33 -060012087 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012088 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012089 pipe_ms_state_ci.pNext = NULL;
12090 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12091 pipe_ms_state_ci.sampleShadingEnable = 0;
12092 pipe_ms_state_ci.minSampleShading = 1.0;
12093 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012094
Tony Barboureb254902015-07-15 12:50:33 -060012095 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012096 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12097 pipeline_layout_ci.pNext = NULL;
12098 pipeline_layout_ci.setLayoutCount = 1;
12099 pipeline_layout_ci.pSetLayouts = &ds_layout;
12100 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012101
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012102 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012103 ASSERT_VK_SUCCESS(err);
12104
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012105 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012106 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 -060012107 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012108 VkPipelineObj pipe(m_device);
12109 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012110 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012111 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012112 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012113 pipe.SetViewport(m_viewports);
12114 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012115 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012116
Tony Barbour552f6c02016-12-21 14:34:07 -070012117 m_commandBuffer->BeginCommandBuffer();
12118 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012119 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012120 // Don't care about actual data, just need to get to draw to flag error
12121 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012122 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012123 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012124 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012125
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012126 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012127
Chia-I Wuf7458c52015-10-26 21:10:41 +080012128 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12129 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12130 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012131}
Mark Muellerdfe37552016-07-07 14:47:42 -060012132
Mark Mueller2ee294f2016-08-04 12:59:48 -060012133TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012134 TEST_DESCRIPTION(
12135 "Use an invalid count in a vkEnumeratePhysicalDevices call."
12136 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060012137 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012138
Mark Mueller880fce52016-08-17 15:23:23 -060012139 // The following test fails with recent NVidia drivers.
12140 // By the time core_validation is reached, the NVidia
12141 // driver has sanitized the invalid condition and core_validation
12142 // is not introduced to the failure condition. This is not the case
12143 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012144 // uint32_t count = static_cast<uint32_t>(~0);
12145 // VkPhysicalDevice physical_device;
12146 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
12147 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012148
Mark Mueller2ee294f2016-08-04 12:59:48 -060012149 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012150 VkDeviceQueueCreateInfo queue_create_info = {};
12151 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12152 queue_create_info.queueCount = 1;
12153 queue_create_info.pQueuePriorities = &queue_priority;
12154 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
12155
12156 VkPhysicalDeviceFeatures features = m_device->phy().features();
12157 VkDevice testDevice;
12158 VkDeviceCreateInfo device_create_info = {};
12159 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12160 device_create_info.queueCreateInfoCount = 1;
12161 device_create_info.pQueueCreateInfos = &queue_create_info;
12162 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012163
Petr Kraus56ed9192017-05-08 23:45:36 +020012164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00054);
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012165 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
12166 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12167 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012168 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12169 m_errorMonitor->VerifyFound();
12170
12171 queue_create_info.queueFamilyIndex = 1;
12172
12173 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
12174 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
12175 for (unsigned i = 0; i < feature_count; i++) {
12176 if (VK_FALSE == feature_array[i]) {
12177 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012178 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12180 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012181 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
12182 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12183 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12185 "You requested features that are unavailable on this device. You should first "
12186 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012187 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12188 m_errorMonitor->VerifyFound();
12189 break;
12190 }
12191 }
12192}
12193
Tobin Ehlis16edf082016-11-21 12:33:49 -070012194TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
12195 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
12196
Tony Barbour1fa09702017-03-16 12:09:08 -060012197 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070012198
12199 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
12200 std::vector<VkDeviceQueueCreateInfo> queue_info;
12201 queue_info.reserve(queue_props.size());
12202 std::vector<std::vector<float>> queue_priorities;
12203 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
12204 VkDeviceQueueCreateInfo qi{};
12205 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12206 qi.queueFamilyIndex = i;
12207 qi.queueCount = queue_props[i].queueCount;
12208 queue_priorities.emplace_back(qi.queueCount, 0.0f);
12209 qi.pQueuePriorities = queue_priorities[i].data();
12210 queue_info.push_back(qi);
12211 }
12212
12213 std::vector<const char *> device_extension_names;
12214
12215 VkDevice local_device;
12216 VkDeviceCreateInfo device_create_info = {};
12217 auto features = m_device->phy().features();
12218 // Intentionally disable pipeline stats
12219 features.pipelineStatisticsQuery = VK_FALSE;
12220 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12221 device_create_info.pNext = NULL;
12222 device_create_info.queueCreateInfoCount = queue_info.size();
12223 device_create_info.pQueueCreateInfos = queue_info.data();
12224 device_create_info.enabledLayerCount = 0;
12225 device_create_info.ppEnabledLayerNames = NULL;
12226 device_create_info.pEnabledFeatures = &features;
12227 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
12228 ASSERT_VK_SUCCESS(err);
12229
12230 VkQueryPoolCreateInfo qpci{};
12231 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12232 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
12233 qpci.queryCount = 1;
12234 VkQueryPool query_pool;
12235
12236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
12237 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
12238 m_errorMonitor->VerifyFound();
12239
12240 vkDestroyDevice(local_device, nullptr);
12241}
12242
Mark Mueller2ee294f2016-08-04 12:59:48 -060012243TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012244 TEST_DESCRIPTION(
12245 "Use an invalid queue index in a vkCmdWaitEvents call."
12246 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012247
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012248 const char *invalid_queue_index =
12249 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
12250 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
12251 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012252
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012253 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012254
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012256
Tony Barbour1fa09702017-03-16 12:09:08 -060012257 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012258
12259 VkEvent event;
12260 VkEventCreateInfo event_create_info{};
12261 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12262 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12263
Mark Mueller2ee294f2016-08-04 12:59:48 -060012264 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012265 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012266
Tony Barbour552f6c02016-12-21 14:34:07 -070012267 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012268
12269 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012270 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 -060012271 ASSERT_TRUE(image.initialized());
12272 VkImageMemoryBarrier img_barrier = {};
12273 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12274 img_barrier.pNext = NULL;
12275 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12276 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12277 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12278 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12279 img_barrier.image = image.handle();
12280 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060012281
12282 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
12283 // that layer validation catches the case when it is not.
12284 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012285 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12286 img_barrier.subresourceRange.baseArrayLayer = 0;
12287 img_barrier.subresourceRange.baseMipLevel = 0;
12288 img_barrier.subresourceRange.layerCount = 1;
12289 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012290 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
12291 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012292 m_errorMonitor->VerifyFound();
12293
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012295
12296 VkQueryPool query_pool;
12297 VkQueryPoolCreateInfo query_pool_create_info = {};
12298 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12299 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
12300 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012301 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012302
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012303 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012304 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
12305
12306 vkEndCommandBuffer(m_commandBuffer->handle());
12307 m_errorMonitor->VerifyFound();
12308
12309 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
12310 vkDestroyEvent(m_device->device(), event, nullptr);
12311}
12312
Mark Muellerdfe37552016-07-07 14:47:42 -060012313TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012314 TEST_DESCRIPTION(
12315 "Submit a command buffer using deleted vertex buffer, "
12316 "delete a buffer twice, use an invalid offset for each "
12317 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060012318
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012319 const char *deleted_buffer_in_command_buffer =
12320 "Cannot submit cmd buffer "
12321 "using deleted buffer ";
12322 const char *invalid_offset_message =
12323 "vkBindBufferMemory(): "
12324 "memoryOffset is 0x";
12325 const char *invalid_storage_buffer_offset_message =
12326 "vkBindBufferMemory(): "
12327 "storage memoryOffset "
12328 "is 0x";
12329 const char *invalid_texel_buffer_offset_message =
12330 "vkBindBufferMemory(): "
12331 "texel memoryOffset "
12332 "is 0x";
12333 const char *invalid_uniform_buffer_offset_message =
12334 "vkBindBufferMemory(): "
12335 "uniform memoryOffset "
12336 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060012337
Tony Barbour1fa09702017-03-16 12:09:08 -060012338 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060012339 ASSERT_NO_FATAL_FAILURE(InitViewport());
12340 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12341
12342 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012343 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060012344 pipe_ms_state_ci.pNext = NULL;
12345 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12346 pipe_ms_state_ci.sampleShadingEnable = 0;
12347 pipe_ms_state_ci.minSampleShading = 1.0;
12348 pipe_ms_state_ci.pSampleMask = nullptr;
12349
12350 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12351 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12352 VkPipelineLayout pipeline_layout;
12353
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012354 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060012355 ASSERT_VK_SUCCESS(err);
12356
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012357 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12358 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060012359 VkPipelineObj pipe(m_device);
12360 pipe.AddShader(&vs);
12361 pipe.AddShader(&fs);
12362 pipe.AddColorAttachment();
12363 pipe.SetMSAA(&pipe_ms_state_ci);
12364 pipe.SetViewport(m_viewports);
12365 pipe.SetScissor(m_scissors);
12366 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12367
Tony Barbour552f6c02016-12-21 14:34:07 -070012368 m_commandBuffer->BeginCommandBuffer();
12369 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012370 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060012371
12372 {
12373 // Create and bind a vertex buffer in a reduced scope, which will cause
12374 // it to be deleted upon leaving this scope
12375 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012376 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060012377 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12378 draw_verticies.AddVertexInputToPipe(pipe);
12379 }
12380
12381 Draw(1, 0, 0, 0);
12382
Tony Barbour552f6c02016-12-21 14:34:07 -070012383 m_commandBuffer->EndRenderPass();
12384 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060012385
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060012387 QueueCommandBuffer(false);
12388 m_errorMonitor->VerifyFound();
12389
12390 {
12391 // Create and bind a vertex buffer in a reduced scope, and delete it
12392 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012393 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060012395 buffer_test.TestDoubleDestroy();
12396 }
12397 m_errorMonitor->VerifyFound();
12398
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012399 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012400 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012401 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012403 m_errorMonitor->SetUnexpectedError(
12404 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
12405 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012406 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
12407 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012408 m_errorMonitor->VerifyFound();
12409 }
12410
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012411 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
12412 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012413 // Create and bind a memory buffer with an invalid offset again,
12414 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012416 m_errorMonitor->SetUnexpectedError(
12417 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12418 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012419 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12420 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012421 m_errorMonitor->VerifyFound();
12422 }
12423
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012424 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012425 // Create and bind a memory buffer with an invalid offset again, but
12426 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012428 m_errorMonitor->SetUnexpectedError(
12429 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12430 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012431 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12432 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012433 m_errorMonitor->VerifyFound();
12434 }
12435
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012436 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012437 // Create and bind a memory buffer with an invalid offset again, but
12438 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012440 m_errorMonitor->SetUnexpectedError(
12441 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12442 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012443 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12444 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012445 m_errorMonitor->VerifyFound();
12446 }
12447
12448 {
12449 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012451 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
12452 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012453 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
12454 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012455 m_errorMonitor->VerifyFound();
12456 }
12457
12458 {
12459 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012461 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
12462 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012463 }
12464 m_errorMonitor->VerifyFound();
12465
12466 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12467}
12468
Tony Barbourff1351e2017-05-10 11:14:03 -060012469TEST_F(VkLayerTest, BadVertexBufferOffset) {
12470 TEST_DESCRIPTION("Submit an offset past the end of a vertex buffer");
12471
12472 ASSERT_NO_FATAL_FAILURE(Init());
12473 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12474 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Tony Barboure94224e2017-05-11 15:22:43 -060012475 VkConstantBufferObj vbo(m_device, 3, sizeof(float), (const void *)&vbo_data);
Tony Barbourff1351e2017-05-10 11:14:03 -060012476 m_commandBuffer->BeginCommandBuffer();
12477 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
12478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01417);
Tony Barboure94224e2017-05-11 15:22:43 -060012479 BindVertexBuffer(&vbo, (VkDeviceSize)(3 * sizeof(float)), 1); // Offset at the end of the buffer
Tony Barbourff1351e2017-05-10 11:14:03 -060012480 m_errorMonitor->VerifyFound();
12481}
12482
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012483// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12484TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012485 TEST_DESCRIPTION(
12486 "Hit all possible validation checks associated with the "
12487 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12488 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012489 // 3 in ValidateCmdBufImageLayouts
12490 // * -1 Attempt to submit cmd buf w/ deleted image
12491 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12492 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012493
Tony Barbour1fa09702017-03-16 12:09:08 -060012494 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060012495 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070012496 if (!depth_format) {
12497 printf(" No Depth + Stencil format found. Skipped.\n");
12498 return;
12499 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012500 // Create src & dst images to use for copy operations
12501 VkImage src_image;
12502 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080012503 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012504
12505 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12506 const int32_t tex_width = 32;
12507 const int32_t tex_height = 32;
12508
12509 VkImageCreateInfo image_create_info = {};
12510 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12511 image_create_info.pNext = NULL;
12512 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12513 image_create_info.format = tex_format;
12514 image_create_info.extent.width = tex_width;
12515 image_create_info.extent.height = tex_height;
12516 image_create_info.extent.depth = 1;
12517 image_create_info.mipLevels = 1;
12518 image_create_info.arrayLayers = 4;
12519 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12520 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12521 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080012522 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012523 image_create_info.flags = 0;
12524
12525 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12526 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012527 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012528 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12529 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012530 image_create_info.format = VK_FORMAT_D32_SFLOAT;
12531 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
12532 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
12533 ASSERT_VK_SUCCESS(err);
12534
12535 // Allocate memory
12536 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080012537 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080012538 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080012539 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12540 mem_alloc.pNext = NULL;
12541 mem_alloc.allocationSize = 0;
12542 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080012543
12544 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012545 mem_alloc.allocationSize = img_mem_reqs.size;
12546 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012547 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080012548 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080012549 ASSERT_VK_SUCCESS(err);
12550
12551 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012552 mem_alloc.allocationSize = img_mem_reqs.size;
12553 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012554 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012555 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012556 ASSERT_VK_SUCCESS(err);
12557
12558 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012559 mem_alloc.allocationSize = img_mem_reqs.size;
12560 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012561 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012562 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012563 ASSERT_VK_SUCCESS(err);
12564
12565 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12566 ASSERT_VK_SUCCESS(err);
12567 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12568 ASSERT_VK_SUCCESS(err);
12569 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12570 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012571
Tony Barbour552f6c02016-12-21 14:34:07 -070012572 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012573 VkImageCopy copy_region;
12574 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12575 copy_region.srcSubresource.mipLevel = 0;
12576 copy_region.srcSubresource.baseArrayLayer = 0;
12577 copy_region.srcSubresource.layerCount = 1;
12578 copy_region.srcOffset.x = 0;
12579 copy_region.srcOffset.y = 0;
12580 copy_region.srcOffset.z = 0;
12581 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12582 copy_region.dstSubresource.mipLevel = 0;
12583 copy_region.dstSubresource.baseArrayLayer = 0;
12584 copy_region.dstSubresource.layerCount = 1;
12585 copy_region.dstOffset.x = 0;
12586 copy_region.dstOffset.y = 0;
12587 copy_region.dstOffset.z = 0;
12588 copy_region.extent.width = 1;
12589 copy_region.extent.height = 1;
12590 copy_region.extent.depth = 1;
12591
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12593 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12594 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012595
Cort530cf382016-12-08 09:59:47 -080012596 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 -060012597 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012598 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12599 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012600 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12601 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012602 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 -060012603 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012605 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12606 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Mark Lobodzinskic61e1da2017-05-15 16:18:13 -060012607 m_errorMonitor->SetUnexpectedError("is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT");
Cort530cf382016-12-08 09:59:47 -080012608 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 -060012609 m_errorMonitor->VerifyFound();
12610 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012612 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012613 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012614 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012615 "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 -080012616 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 -060012617 m_errorMonitor->VerifyFound();
12618 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12620 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12621 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012622 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 -060012623 m_errorMonitor->VerifyFound();
12624 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012626 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012627 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012628 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012629 "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 -080012630 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 -060012631 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012633 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12634 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012635 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012636 "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 -080012637 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 -060012638 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012639
Cort3b021012016-12-07 12:00:57 -080012640 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12641 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12642 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12643 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12644 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12645 transfer_dst_image_barrier[0].srcAccessMask = 0;
12646 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12647 transfer_dst_image_barrier[0].image = dst_image;
12648 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12649 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12650 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12651 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12652 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12653 transfer_dst_image_barrier[0].image = depth_image;
12654 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12655 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12656 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12657
12658 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012659 VkClearColorValue color_clear_value = {};
12660 VkImageSubresourceRange clear_range;
12661 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12662 clear_range.baseMipLevel = 0;
12663 clear_range.baseArrayLayer = 0;
12664 clear_range.layerCount = 1;
12665 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012666
Cort3b021012016-12-07 12:00:57 -080012667 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12668 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012671 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012672 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012673 // Fail due to provided layout not matching actual current layout for color clear.
12674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012675 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012676 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012677
Cort530cf382016-12-08 09:59:47 -080012678 VkClearDepthStencilValue depth_clear_value = {};
12679 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012680
12681 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12682 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012685 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012686 m_errorMonitor->VerifyFound();
12687 // Fail due to provided layout not matching actual current layout for depth clear.
12688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012689 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012690 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012691
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012692 // Now cause error due to bad image layout transition in PipelineBarrier
12693 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012694 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012695 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012696 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012697 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012698 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12699 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012700 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012702 "you cannot transition the layout of aspect 1 from "
12703 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12704 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012706 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12707 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012708 m_errorMonitor->VerifyFound();
12709
12710 // Finally some layout errors at RenderPass create time
12711 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12712 VkAttachmentReference attach = {};
12713 // perf warning for GENERAL layout w/ non-DS input attachment
12714 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12715 VkSubpassDescription subpass = {};
12716 subpass.inputAttachmentCount = 1;
12717 subpass.pInputAttachments = &attach;
12718 VkRenderPassCreateInfo rpci = {};
12719 rpci.subpassCount = 1;
12720 rpci.pSubpasses = &subpass;
12721 rpci.attachmentCount = 1;
12722 VkAttachmentDescription attach_desc = {};
12723 attach_desc.format = VK_FORMAT_UNDEFINED;
12724 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012725 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012726 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12728 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012729 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12730 m_errorMonitor->VerifyFound();
12731 // error w/ non-general layout
12732 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12733
12734 m_errorMonitor->SetDesiredFailureMsg(
12735 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12736 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12737 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12738 m_errorMonitor->VerifyFound();
12739 subpass.inputAttachmentCount = 0;
12740 subpass.colorAttachmentCount = 1;
12741 subpass.pColorAttachments = &attach;
12742 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12743 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12745 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012746 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12747 m_errorMonitor->VerifyFound();
12748 // error w/ non-color opt or GENERAL layout for color attachment
12749 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12750 m_errorMonitor->SetDesiredFailureMsg(
12751 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12752 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12753 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12754 m_errorMonitor->VerifyFound();
12755 subpass.colorAttachmentCount = 0;
12756 subpass.pDepthStencilAttachment = &attach;
12757 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12758 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12760 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012761 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12762 m_errorMonitor->VerifyFound();
12763 // error w/ non-ds opt or GENERAL layout for color attachment
12764 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12766 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12767 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012768 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12769 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012770 // For this error we need a valid renderpass so create default one
12771 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12772 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012773 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012774 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12775 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12776 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12777 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12778 // Can't do a CLEAR load on READ_ONLY initialLayout
12779 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12780 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12781 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012783 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012784 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12785 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012786
Cort3b021012016-12-07 12:00:57 -080012787 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12788 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12789 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012790 vkDestroyImage(m_device->device(), src_image, NULL);
12791 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012792 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012793}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012794
Tobin Ehlise0936662016-10-11 08:10:51 -060012795TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12796 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12797 VkResult err;
12798
Tony Barbour1fa09702017-03-16 12:09:08 -060012799 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012800
12801 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12802 VkImageTiling tiling;
12803 VkFormatProperties format_properties;
12804 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12805 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12806 tiling = VK_IMAGE_TILING_LINEAR;
12807 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12808 tiling = VK_IMAGE_TILING_OPTIMAL;
12809 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012810 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012811 return;
12812 }
12813
12814 VkDescriptorPoolSize ds_type = {};
12815 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12816 ds_type.descriptorCount = 1;
12817
12818 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12819 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12820 ds_pool_ci.maxSets = 1;
12821 ds_pool_ci.poolSizeCount = 1;
12822 ds_pool_ci.pPoolSizes = &ds_type;
12823 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12824
12825 VkDescriptorPool ds_pool;
12826 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12827 ASSERT_VK_SUCCESS(err);
12828
12829 VkDescriptorSetLayoutBinding dsl_binding = {};
12830 dsl_binding.binding = 0;
12831 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12832 dsl_binding.descriptorCount = 1;
12833 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12834 dsl_binding.pImmutableSamplers = NULL;
12835
12836 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12837 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12838 ds_layout_ci.pNext = NULL;
12839 ds_layout_ci.bindingCount = 1;
12840 ds_layout_ci.pBindings = &dsl_binding;
12841
12842 VkDescriptorSetLayout ds_layout;
12843 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12844 ASSERT_VK_SUCCESS(err);
12845
12846 VkDescriptorSetAllocateInfo alloc_info = {};
12847 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12848 alloc_info.descriptorSetCount = 1;
12849 alloc_info.descriptorPool = ds_pool;
12850 alloc_info.pSetLayouts = &ds_layout;
12851 VkDescriptorSet descriptor_set;
12852 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12853 ASSERT_VK_SUCCESS(err);
12854
12855 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12856 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12857 pipeline_layout_ci.pNext = NULL;
12858 pipeline_layout_ci.setLayoutCount = 1;
12859 pipeline_layout_ci.pSetLayouts = &ds_layout;
12860 VkPipelineLayout pipeline_layout;
12861 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12862 ASSERT_VK_SUCCESS(err);
12863
12864 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012865 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012866 ASSERT_TRUE(image.initialized());
12867 VkImageView view = image.targetView(tex_format);
12868
12869 VkDescriptorImageInfo image_info = {};
12870 image_info.imageView = view;
12871 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12872
12873 VkWriteDescriptorSet descriptor_write = {};
12874 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12875 descriptor_write.dstSet = descriptor_set;
12876 descriptor_write.dstBinding = 0;
12877 descriptor_write.descriptorCount = 1;
12878 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12879 descriptor_write.pImageInfo = &image_info;
12880
12881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12882 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12883 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12884 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12885 m_errorMonitor->VerifyFound();
12886
12887 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12888 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12889 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12890 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12891}
12892
Chris Forbes3fa68552017-05-18 14:34:05 -070012893TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
Tony Barbour1fa09702017-03-16 12:09:08 -060012894 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fa68552017-05-18 14:34:05 -070012895 const char *simultaneous_use_message =
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012896 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12897 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012898
Chris Forbes3fa68552017-05-18 14:34:05 -070012899 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
Mark Mueller93b938f2016-08-18 10:27:40 -060012900
Chris Forbes3fa68552017-05-18 14:34:05 -070012901 secondary.begin();
12902 secondary.end();
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012903
Chris Forbes3fa68552017-05-18 14:34:05 -070012904 VkCommandBufferBeginInfo cbbi = {
12905 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
12906 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr,
12907 };
Mark Mueller93b938f2016-08-18 10:27:40 -060012908
Chris Forbes3fa68552017-05-18 14:34:05 -070012909 m_commandBuffer->begin(&cbbi);
12910 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message);
12911 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012912 m_errorMonitor->VerifyFound();
Chris Forbes3fa68552017-05-18 14:34:05 -070012913 m_commandBuffer->end();
12914}
Mark Mueller93b938f2016-08-18 10:27:40 -060012915
Chris Forbes3fa68552017-05-18 14:34:05 -070012916TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
12917 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012918
Chris Forbes3fa68552017-05-18 14:34:05 -070012919 const char *simultaneous_use_message = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Mueller4042b652016-09-05 22:52:21 -060012920
Chris Forbes3fa68552017-05-18 14:34:05 -070012921 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
12922
12923 VkCommandBufferInheritanceInfo inh = {
12924 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, nullptr,
12925 };
12926 VkCommandBufferBeginInfo cbbi = {
12927 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
12928 0, &inh
12929 };
12930
12931 secondary.begin(&cbbi);
12932 secondary.end();
12933
12934 m_commandBuffer->begin();
12935 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
12936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12937 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012938 m_errorMonitor->VerifyFound();
Chris Forbes3fa68552017-05-18 14:34:05 -070012939 m_commandBuffer->end();
12940}
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012941
Chris Forbes3fa68552017-05-18 14:34:05 -070012942TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
12943 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012944
Chris Forbes3fa68552017-05-18 14:34:05 -070012945 // variation on previous test executing the same CB twice in the same
12946 // CmdExecuteCommands call
12947
12948 const char *simultaneous_use_message = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
12949
12950 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
12951
12952 VkCommandBufferInheritanceInfo inh = {
12953 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, nullptr,
12954 };
12955 VkCommandBufferBeginInfo cbbi = {
12956 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
12957 0, &inh
12958 };
12959
12960 secondary.begin(&cbbi);
12961 secondary.end();
12962
12963 m_commandBuffer->begin();
12964 VkCommandBuffer cbs[] = { secondary.handle(), secondary.handle() };
12965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12966 vkCmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
12967 m_errorMonitor->VerifyFound();
12968 m_commandBuffer->end();
Mark Mueller93b938f2016-08-18 10:27:40 -060012969}
12970
Tony Barbour626994c2017-02-08 15:29:37 -070012971TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12972 TEST_DESCRIPTION(
12973 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12974 "errors");
12975 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12976 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 -060012977 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012978
12979 VkCommandBuffer cmd_bufs[2];
12980 VkCommandBufferAllocateInfo alloc_info;
12981 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12982 alloc_info.pNext = NULL;
12983 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012984 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012985 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12986 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12987
12988 VkCommandBufferBeginInfo cb_binfo;
12989 cb_binfo.pNext = NULL;
12990 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12991 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12992 cb_binfo.flags = 0;
12993 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12994 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12995 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12996 vkEndCommandBuffer(cmd_bufs[0]);
12997 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12998
12999 VkSubmitInfo submit_info = {};
13000 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13001 submit_info.commandBufferCount = 2;
13002 submit_info.pCommandBuffers = duplicates;
13003 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
13004 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13005 m_errorMonitor->VerifyFound();
13006 vkQueueWaitIdle(m_device->m_queue);
13007
13008 // Set one time use and now look for one time submit
13009 duplicates[0] = duplicates[1] = cmd_bufs[1];
13010 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
13011 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
13012 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
13013 vkEndCommandBuffer(cmd_bufs[1]);
13014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
13015 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13016 m_errorMonitor->VerifyFound();
13017 vkQueueWaitIdle(m_device->m_queue);
13018}
13019
Tobin Ehlisb093da82017-01-19 12:05:27 -070013020TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013021 TEST_DESCRIPTION(
13022 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
13023 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070013024
Tony Barbour1fa09702017-03-16 12:09:08 -060013025 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070013026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13027
13028 std::vector<const char *> device_extension_names;
13029 auto features = m_device->phy().features();
13030 // Make sure gs & ts are disabled
13031 features.geometryShader = false;
13032 features.tessellationShader = false;
13033 // The sacrificial device object
13034 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13035
13036 VkCommandPoolCreateInfo pool_create_info{};
13037 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
13038 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
13039
13040 VkCommandPool command_pool;
13041 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
13042
13043 VkCommandBufferAllocateInfo cmd = {};
13044 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
13045 cmd.pNext = NULL;
13046 cmd.commandPool = command_pool;
13047 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
13048 cmd.commandBufferCount = 1;
13049
13050 VkCommandBuffer cmd_buffer;
13051 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
13052 ASSERT_VK_SUCCESS(err);
13053
13054 VkEvent event;
13055 VkEventCreateInfo evci = {};
13056 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13057 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
13058 ASSERT_VK_SUCCESS(result);
13059
13060 VkCommandBufferBeginInfo cbbi = {};
13061 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13062 vkBeginCommandBuffer(cmd_buffer, &cbbi);
13063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
13064 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
13065 m_errorMonitor->VerifyFound();
13066
13067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
13068 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
13069 m_errorMonitor->VerifyFound();
13070
13071 vkDestroyEvent(test_device.handle(), event, NULL);
13072 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
13073}
13074
Chris Forbesd70103a2017-04-13 11:34:09 -070013075TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060013076 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060013077 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13078
Tony Barbour552f6c02016-12-21 14:34:07 -070013079 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013080
13081 VkEvent event;
13082 VkEventCreateInfo event_create_info = {};
13083 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13084 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013085 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013086
Tony Barbour552f6c02016-12-21 14:34:07 -070013087 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060013088 vkDestroyEvent(m_device->device(), event, nullptr);
13089
13090 VkSubmitInfo submit_info = {};
13091 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13092 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013093 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070013094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060013095 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13096 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070013097}
Mark Muellerc8d441e2016-08-23 17:36:00 -060013098
Chris Forbesd70103a2017-04-13 11:34:09 -070013099TEST_F(VkLayerTest, InUseDestroyedSignaled) {
13100 TEST_DESCRIPTION(
13101 "Use vkCmdExecuteCommands with invalid state "
13102 "in primary and secondary command buffers. "
13103 "Delete objects that are inuse. Call VkQueueSubmit "
13104 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060013105
Chris Forbesd70103a2017-04-13 11:34:09 -070013106 ASSERT_NO_FATAL_FAILURE(Init());
13107 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13108
13109 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060013110
Mark Mueller917f6bc2016-08-30 10:57:19 -060013111 VkSemaphoreCreateInfo semaphore_create_info = {};
13112 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13113 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013114 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013115 VkFenceCreateInfo fence_create_info = {};
13116 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13117 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013118 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013119
13120 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013121 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013122 descriptor_pool_type_count.descriptorCount = 1;
13123
13124 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13125 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13126 descriptor_pool_create_info.maxSets = 1;
13127 descriptor_pool_create_info.poolSizeCount = 1;
13128 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013129 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013130
13131 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013132 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013133
13134 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013135 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013136 descriptorset_layout_binding.descriptorCount = 1;
13137 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13138
13139 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013140 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013141 descriptorset_layout_create_info.bindingCount = 1;
13142 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13143
13144 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013145 ASSERT_VK_SUCCESS(
13146 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013147
13148 VkDescriptorSet descriptorset;
13149 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013150 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013151 descriptorset_allocate_info.descriptorSetCount = 1;
13152 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13153 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013154 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013155
Mark Mueller4042b652016-09-05 22:52:21 -060013156 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13157
13158 VkDescriptorBufferInfo buffer_info = {};
13159 buffer_info.buffer = buffer_test.GetBuffer();
13160 buffer_info.offset = 0;
13161 buffer_info.range = 1024;
13162
13163 VkWriteDescriptorSet write_descriptor_set = {};
13164 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13165 write_descriptor_set.dstSet = descriptorset;
13166 write_descriptor_set.descriptorCount = 1;
13167 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13168 write_descriptor_set.pBufferInfo = &buffer_info;
13169
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013170 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060013171
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013172 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13173 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013174
13175 VkPipelineObj pipe(m_device);
13176 pipe.AddColorAttachment();
13177 pipe.AddShader(&vs);
13178 pipe.AddShader(&fs);
13179
13180 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013181 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013182 pipeline_layout_create_info.setLayoutCount = 1;
13183 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13184
13185 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013186 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013187
13188 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
13189
Chris Forbesd70103a2017-04-13 11:34:09 -070013190 VkEvent event;
13191 VkEventCreateInfo event_create_info = {};
13192 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13193 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
13194
Tony Barbour552f6c02016-12-21 14:34:07 -070013195 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070013196
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013197 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013198
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013199 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13200 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13201 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013202
Tony Barbour552f6c02016-12-21 14:34:07 -070013203 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013204
Chris Forbesd70103a2017-04-13 11:34:09 -070013205 VkSubmitInfo submit_info = {};
13206 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13207 submit_info.commandBufferCount = 1;
13208 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013209 submit_info.signalSemaphoreCount = 1;
13210 submit_info.pSignalSemaphores = &semaphore;
13211 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013212 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060013213
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013215 vkDestroyEvent(m_device->device(), event, nullptr);
13216 m_errorMonitor->VerifyFound();
13217
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013219 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13220 m_errorMonitor->VerifyFound();
13221
Jeremy Hayes08369882017-02-02 10:31:06 -070013222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013223 vkDestroyFence(m_device->device(), fence, nullptr);
13224 m_errorMonitor->VerifyFound();
13225
Tobin Ehlis122207b2016-09-01 08:50:06 -070013226 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013227 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
13228 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013229 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013230 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
13231 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013232 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013233 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
13234 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013235 vkDestroyEvent(m_device->device(), event, nullptr);
13236 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013237 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013238 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13239}
13240
Tobin Ehlis2adda372016-09-01 08:51:06 -070013241TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
13242 TEST_DESCRIPTION("Delete in-use query pool.");
13243
Tony Barbour1fa09702017-03-16 12:09:08 -060013244 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070013245 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13246
13247 VkQueryPool query_pool;
13248 VkQueryPoolCreateInfo query_pool_ci{};
13249 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
13250 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
13251 query_pool_ci.queryCount = 1;
13252 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070013253 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013254 // Reset query pool to create binding with cmd buffer
13255 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
13256
Tony Barbour552f6c02016-12-21 14:34:07 -070013257 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013258
13259 VkSubmitInfo submit_info = {};
13260 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13261 submit_info.commandBufferCount = 1;
13262 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13263 // Submit cmd buffer and then destroy query pool while in-flight
13264 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13265
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070013267 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13268 m_errorMonitor->VerifyFound();
13269
13270 vkQueueWaitIdle(m_device->m_queue);
13271 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013272 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013273 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070013274 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13275}
13276
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013277TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
13278 TEST_DESCRIPTION("Delete in-use pipeline.");
13279
Tony Barbour1fa09702017-03-16 12:09:08 -060013280 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013281 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13282
13283 // Empty pipeline layout used for binding PSO
13284 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13285 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13286 pipeline_layout_ci.setLayoutCount = 0;
13287 pipeline_layout_ci.pSetLayouts = NULL;
13288
13289 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013290 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013291 ASSERT_VK_SUCCESS(err);
13292
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013294 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013295 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13296 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013297 // Store pipeline handle so we can actually delete it before test finishes
13298 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013299 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013300 VkPipelineObj pipe(m_device);
13301 pipe.AddShader(&vs);
13302 pipe.AddShader(&fs);
13303 pipe.AddColorAttachment();
13304 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13305 delete_this_pipeline = pipe.handle();
13306
Tony Barbour552f6c02016-12-21 14:34:07 -070013307 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013308 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013309 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013310
Tony Barbour552f6c02016-12-21 14:34:07 -070013311 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013312
13313 VkSubmitInfo submit_info = {};
13314 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13315 submit_info.commandBufferCount = 1;
13316 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13317 // Submit cmd buffer and then pipeline destroyed while in-flight
13318 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013319 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013320 m_errorMonitor->VerifyFound();
13321 // Make sure queue finished and then actually delete pipeline
13322 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013323 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
13324 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013325 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
13326 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
13327}
13328
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013329TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
13330 TEST_DESCRIPTION("Delete in-use imageView.");
13331
Tony Barbour1fa09702017-03-16 12:09:08 -060013332 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013333 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13334
13335 VkDescriptorPoolSize ds_type_count;
13336 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13337 ds_type_count.descriptorCount = 1;
13338
13339 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13340 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13341 ds_pool_ci.maxSets = 1;
13342 ds_pool_ci.poolSizeCount = 1;
13343 ds_pool_ci.pPoolSizes = &ds_type_count;
13344
13345 VkDescriptorPool ds_pool;
13346 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13347 ASSERT_VK_SUCCESS(err);
13348
13349 VkSamplerCreateInfo sampler_ci = {};
13350 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13351 sampler_ci.pNext = NULL;
13352 sampler_ci.magFilter = VK_FILTER_NEAREST;
13353 sampler_ci.minFilter = VK_FILTER_NEAREST;
13354 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13355 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13356 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13357 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13358 sampler_ci.mipLodBias = 1.0;
13359 sampler_ci.anisotropyEnable = VK_FALSE;
13360 sampler_ci.maxAnisotropy = 1;
13361 sampler_ci.compareEnable = VK_FALSE;
13362 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13363 sampler_ci.minLod = 1.0;
13364 sampler_ci.maxLod = 1.0;
13365 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13366 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13367 VkSampler sampler;
13368
13369 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13370 ASSERT_VK_SUCCESS(err);
13371
13372 VkDescriptorSetLayoutBinding layout_binding;
13373 layout_binding.binding = 0;
13374 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13375 layout_binding.descriptorCount = 1;
13376 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13377 layout_binding.pImmutableSamplers = NULL;
13378
13379 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13380 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13381 ds_layout_ci.bindingCount = 1;
13382 ds_layout_ci.pBindings = &layout_binding;
13383 VkDescriptorSetLayout ds_layout;
13384 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13385 ASSERT_VK_SUCCESS(err);
13386
13387 VkDescriptorSetAllocateInfo alloc_info = {};
13388 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13389 alloc_info.descriptorSetCount = 1;
13390 alloc_info.descriptorPool = ds_pool;
13391 alloc_info.pSetLayouts = &ds_layout;
13392 VkDescriptorSet descriptor_set;
13393 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13394 ASSERT_VK_SUCCESS(err);
13395
13396 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13397 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13398 pipeline_layout_ci.pNext = NULL;
13399 pipeline_layout_ci.setLayoutCount = 1;
13400 pipeline_layout_ci.pSetLayouts = &ds_layout;
13401
13402 VkPipelineLayout pipeline_layout;
13403 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13404 ASSERT_VK_SUCCESS(err);
13405
13406 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013407 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 -060013408 ASSERT_TRUE(image.initialized());
13409
13410 VkImageView view;
13411 VkImageViewCreateInfo ivci = {};
13412 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13413 ivci.image = image.handle();
13414 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13415 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13416 ivci.subresourceRange.layerCount = 1;
13417 ivci.subresourceRange.baseMipLevel = 0;
13418 ivci.subresourceRange.levelCount = 1;
13419 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13420
13421 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13422 ASSERT_VK_SUCCESS(err);
13423
13424 VkDescriptorImageInfo image_info{};
13425 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13426 image_info.imageView = view;
13427 image_info.sampler = sampler;
13428
13429 VkWriteDescriptorSet descriptor_write = {};
13430 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13431 descriptor_write.dstSet = descriptor_set;
13432 descriptor_write.dstBinding = 0;
13433 descriptor_write.descriptorCount = 1;
13434 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13435 descriptor_write.pImageInfo = &image_info;
13436
13437 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13438
13439 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013440 char const *vsSource =
13441 "#version 450\n"
13442 "\n"
13443 "out gl_PerVertex { \n"
13444 " vec4 gl_Position;\n"
13445 "};\n"
13446 "void main(){\n"
13447 " gl_Position = vec4(1);\n"
13448 "}\n";
13449 char const *fsSource =
13450 "#version 450\n"
13451 "\n"
13452 "layout(set=0, binding=0) uniform sampler2D s;\n"
13453 "layout(location=0) out vec4 x;\n"
13454 "void main(){\n"
13455 " x = texture(s, vec2(1));\n"
13456 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013457 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13458 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13459 VkPipelineObj pipe(m_device);
13460 pipe.AddShader(&vs);
13461 pipe.AddShader(&fs);
13462 pipe.AddColorAttachment();
13463 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13464
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013466
Tony Barbour552f6c02016-12-21 14:34:07 -070013467 m_commandBuffer->BeginCommandBuffer();
13468 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013469 // Bind pipeline to cmd buffer
13470 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13471 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13472 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070013473
13474 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13475 VkRect2D scissor = {{0, 0}, {16, 16}};
13476 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13477 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13478
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013479 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013480 m_commandBuffer->EndRenderPass();
13481 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013482 // Submit cmd buffer then destroy sampler
13483 VkSubmitInfo submit_info = {};
13484 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13485 submit_info.commandBufferCount = 1;
13486 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13487 // Submit cmd buffer and then destroy imageView while in-flight
13488 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13489
13490 vkDestroyImageView(m_device->device(), view, nullptr);
13491 m_errorMonitor->VerifyFound();
13492 vkQueueWaitIdle(m_device->m_queue);
13493 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013494 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013495 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013496 vkDestroyImageView(m_device->device(), view, NULL);
13497 vkDestroySampler(m_device->device(), sampler, nullptr);
13498 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13499 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13500 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13501}
13502
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013503TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
13504 TEST_DESCRIPTION("Delete in-use bufferView.");
13505
Tony Barbour1fa09702017-03-16 12:09:08 -060013506 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013507 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13508
13509 VkDescriptorPoolSize ds_type_count;
13510 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13511 ds_type_count.descriptorCount = 1;
13512
13513 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13514 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13515 ds_pool_ci.maxSets = 1;
13516 ds_pool_ci.poolSizeCount = 1;
13517 ds_pool_ci.pPoolSizes = &ds_type_count;
13518
13519 VkDescriptorPool ds_pool;
13520 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13521 ASSERT_VK_SUCCESS(err);
13522
13523 VkDescriptorSetLayoutBinding layout_binding;
13524 layout_binding.binding = 0;
13525 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13526 layout_binding.descriptorCount = 1;
13527 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13528 layout_binding.pImmutableSamplers = NULL;
13529
13530 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13531 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13532 ds_layout_ci.bindingCount = 1;
13533 ds_layout_ci.pBindings = &layout_binding;
13534 VkDescriptorSetLayout ds_layout;
13535 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13536 ASSERT_VK_SUCCESS(err);
13537
13538 VkDescriptorSetAllocateInfo alloc_info = {};
13539 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13540 alloc_info.descriptorSetCount = 1;
13541 alloc_info.descriptorPool = ds_pool;
13542 alloc_info.pSetLayouts = &ds_layout;
13543 VkDescriptorSet descriptor_set;
13544 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13545 ASSERT_VK_SUCCESS(err);
13546
13547 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13548 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13549 pipeline_layout_ci.pNext = NULL;
13550 pipeline_layout_ci.setLayoutCount = 1;
13551 pipeline_layout_ci.pSetLayouts = &ds_layout;
13552
13553 VkPipelineLayout pipeline_layout;
13554 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13555 ASSERT_VK_SUCCESS(err);
13556
13557 VkBuffer buffer;
13558 uint32_t queue_family_index = 0;
13559 VkBufferCreateInfo buffer_create_info = {};
13560 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
13561 buffer_create_info.size = 1024;
13562 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13563 buffer_create_info.queueFamilyIndexCount = 1;
13564 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13565
13566 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13567 ASSERT_VK_SUCCESS(err);
13568
13569 VkMemoryRequirements memory_reqs;
13570 VkDeviceMemory buffer_memory;
13571
13572 VkMemoryAllocateInfo memory_info = {};
13573 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13574 memory_info.allocationSize = 0;
13575 memory_info.memoryTypeIndex = 0;
13576
13577 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13578 memory_info.allocationSize = memory_reqs.size;
13579 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13580 ASSERT_TRUE(pass);
13581
13582 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13583 ASSERT_VK_SUCCESS(err);
13584 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13585 ASSERT_VK_SUCCESS(err);
13586
13587 VkBufferView view;
13588 VkBufferViewCreateInfo bvci = {};
13589 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13590 bvci.buffer = buffer;
13591 bvci.format = VK_FORMAT_R8_UNORM;
13592 bvci.range = VK_WHOLE_SIZE;
13593
13594 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13595 ASSERT_VK_SUCCESS(err);
13596
13597 VkWriteDescriptorSet descriptor_write = {};
13598 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13599 descriptor_write.dstSet = descriptor_set;
13600 descriptor_write.dstBinding = 0;
13601 descriptor_write.descriptorCount = 1;
13602 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13603 descriptor_write.pTexelBufferView = &view;
13604
13605 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13606
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013607 char const *vsSource =
13608 "#version 450\n"
13609 "\n"
13610 "out gl_PerVertex { \n"
13611 " vec4 gl_Position;\n"
13612 "};\n"
13613 "void main(){\n"
13614 " gl_Position = vec4(1);\n"
13615 "}\n";
13616 char const *fsSource =
13617 "#version 450\n"
13618 "\n"
13619 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13620 "layout(location=0) out vec4 x;\n"
13621 "void main(){\n"
13622 " x = imageLoad(s, 0);\n"
13623 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013624 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13625 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13626 VkPipelineObj pipe(m_device);
13627 pipe.AddShader(&vs);
13628 pipe.AddShader(&fs);
13629 pipe.AddColorAttachment();
13630 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13631
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013633
Tony Barbour552f6c02016-12-21 14:34:07 -070013634 m_commandBuffer->BeginCommandBuffer();
13635 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013636 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13637 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13638 VkRect2D scissor = {{0, 0}, {16, 16}};
13639 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13640 // Bind pipeline to cmd buffer
13641 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13642 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13643 &descriptor_set, 0, nullptr);
13644 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013645 m_commandBuffer->EndRenderPass();
13646 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013647
13648 VkSubmitInfo submit_info = {};
13649 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13650 submit_info.commandBufferCount = 1;
13651 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13652 // Submit cmd buffer and then destroy bufferView while in-flight
13653 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13654
13655 vkDestroyBufferView(m_device->device(), view, nullptr);
13656 m_errorMonitor->VerifyFound();
13657 vkQueueWaitIdle(m_device->m_queue);
13658 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013659 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013660 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013661 vkDestroyBufferView(m_device->device(), view, NULL);
13662 vkDestroyBuffer(m_device->device(), buffer, NULL);
13663 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13664 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13665 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13666 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13667}
13668
Tobin Ehlis209532e2016-09-07 13:52:18 -060013669TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13670 TEST_DESCRIPTION("Delete in-use sampler.");
13671
Tony Barbour1fa09702017-03-16 12:09:08 -060013672 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013673 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13674
13675 VkDescriptorPoolSize ds_type_count;
13676 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13677 ds_type_count.descriptorCount = 1;
13678
13679 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13680 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13681 ds_pool_ci.maxSets = 1;
13682 ds_pool_ci.poolSizeCount = 1;
13683 ds_pool_ci.pPoolSizes = &ds_type_count;
13684
13685 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013686 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013687 ASSERT_VK_SUCCESS(err);
13688
13689 VkSamplerCreateInfo sampler_ci = {};
13690 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13691 sampler_ci.pNext = NULL;
13692 sampler_ci.magFilter = VK_FILTER_NEAREST;
13693 sampler_ci.minFilter = VK_FILTER_NEAREST;
13694 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13695 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13696 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13697 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13698 sampler_ci.mipLodBias = 1.0;
13699 sampler_ci.anisotropyEnable = VK_FALSE;
13700 sampler_ci.maxAnisotropy = 1;
13701 sampler_ci.compareEnable = VK_FALSE;
13702 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13703 sampler_ci.minLod = 1.0;
13704 sampler_ci.maxLod = 1.0;
13705 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13706 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13707 VkSampler sampler;
13708
13709 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13710 ASSERT_VK_SUCCESS(err);
13711
13712 VkDescriptorSetLayoutBinding layout_binding;
13713 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013714 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013715 layout_binding.descriptorCount = 1;
13716 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13717 layout_binding.pImmutableSamplers = NULL;
13718
13719 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13720 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13721 ds_layout_ci.bindingCount = 1;
13722 ds_layout_ci.pBindings = &layout_binding;
13723 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013724 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013725 ASSERT_VK_SUCCESS(err);
13726
13727 VkDescriptorSetAllocateInfo alloc_info = {};
13728 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13729 alloc_info.descriptorSetCount = 1;
13730 alloc_info.descriptorPool = ds_pool;
13731 alloc_info.pSetLayouts = &ds_layout;
13732 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013733 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013734 ASSERT_VK_SUCCESS(err);
13735
13736 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13737 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13738 pipeline_layout_ci.pNext = NULL;
13739 pipeline_layout_ci.setLayoutCount = 1;
13740 pipeline_layout_ci.pSetLayouts = &ds_layout;
13741
13742 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013743 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013744 ASSERT_VK_SUCCESS(err);
13745
13746 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013747 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 -060013748 ASSERT_TRUE(image.initialized());
13749
13750 VkImageView view;
13751 VkImageViewCreateInfo ivci = {};
13752 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13753 ivci.image = image.handle();
13754 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13755 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13756 ivci.subresourceRange.layerCount = 1;
13757 ivci.subresourceRange.baseMipLevel = 0;
13758 ivci.subresourceRange.levelCount = 1;
13759 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13760
13761 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13762 ASSERT_VK_SUCCESS(err);
13763
13764 VkDescriptorImageInfo image_info{};
13765 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13766 image_info.imageView = view;
13767 image_info.sampler = sampler;
13768
13769 VkWriteDescriptorSet descriptor_write = {};
13770 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13771 descriptor_write.dstSet = descriptor_set;
13772 descriptor_write.dstBinding = 0;
13773 descriptor_write.descriptorCount = 1;
13774 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13775 descriptor_write.pImageInfo = &image_info;
13776
13777 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13778
13779 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013780 char const *vsSource =
13781 "#version 450\n"
13782 "\n"
13783 "out gl_PerVertex { \n"
13784 " vec4 gl_Position;\n"
13785 "};\n"
13786 "void main(){\n"
13787 " gl_Position = vec4(1);\n"
13788 "}\n";
13789 char const *fsSource =
13790 "#version 450\n"
13791 "\n"
13792 "layout(set=0, binding=0) uniform sampler2D s;\n"
13793 "layout(location=0) out vec4 x;\n"
13794 "void main(){\n"
13795 " x = texture(s, vec2(1));\n"
13796 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013797 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13798 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13799 VkPipelineObj pipe(m_device);
13800 pipe.AddShader(&vs);
13801 pipe.AddShader(&fs);
13802 pipe.AddColorAttachment();
13803 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13804
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013806
Tony Barbour552f6c02016-12-21 14:34:07 -070013807 m_commandBuffer->BeginCommandBuffer();
13808 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013809 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013810 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13811 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13812 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013813
13814 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13815 VkRect2D scissor = {{0, 0}, {16, 16}};
13816 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13817 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13818
Tobin Ehlis209532e2016-09-07 13:52:18 -060013819 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013820 m_commandBuffer->EndRenderPass();
13821 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013822 // Submit cmd buffer then destroy sampler
13823 VkSubmitInfo submit_info = {};
13824 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13825 submit_info.commandBufferCount = 1;
13826 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13827 // Submit cmd buffer and then destroy sampler while in-flight
13828 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13829
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013830 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013831 m_errorMonitor->VerifyFound();
13832 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013833
Tobin Ehlis209532e2016-09-07 13:52:18 -060013834 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013835 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13836 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013837 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013838 vkDestroyImageView(m_device->device(), view, NULL);
13839 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13840 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13841 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13842}
13843
Mark Mueller1cd9f412016-08-25 13:23:52 -060013844TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013845 TEST_DESCRIPTION(
13846 "Call VkQueueSubmit with a semaphore that is already "
13847 "signaled but not waited on by the queue. Wait on a "
13848 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013849
Tony Barbour1fa09702017-03-16 12:09:08 -060013850 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13852
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013853 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 -070013854 const char *invalid_fence_wait_message =
13855 " which has not been submitted on a Queue or during "
13856 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013857
Chris Forbese98aec12017-05-18 12:50:14 -070013858 VkCommandBufferObj cb1(m_device, m_commandPool);
13859 cb1.begin();
13860 cb1.end();
Mark Mueller96a56d52016-08-24 10:28:05 -060013861
13862 VkSemaphoreCreateInfo semaphore_create_info = {};
13863 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13864 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013865 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013866 VkSubmitInfo submit_info = {};
13867 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13868 submit_info.commandBufferCount = 1;
Chris Forbese98aec12017-05-18 12:50:14 -070013869 submit_info.pCommandBuffers = &cb1.handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013870 submit_info.signalSemaphoreCount = 1;
13871 submit_info.pSignalSemaphores = &semaphore;
13872 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Chris Forbese98aec12017-05-18 12:50:14 -070013873
Tony Barbour552f6c02016-12-21 14:34:07 -070013874 m_commandBuffer->BeginCommandBuffer();
13875 m_commandBuffer->EndCommandBuffer();
Chris Forbese98aec12017-05-18 12:50:14 -070013876 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013878 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13879 m_errorMonitor->VerifyFound();
13880
Mark Mueller1cd9f412016-08-25 13:23:52 -060013881 VkFenceCreateInfo fence_create_info = {};
13882 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13883 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013884 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013885
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013887 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13888 m_errorMonitor->VerifyFound();
13889
Mark Mueller4042b652016-09-05 22:52:21 -060013890 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013891 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013892 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13893}
13894
Tobin Ehlis4af23302016-07-19 10:50:30 -060013895TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013896 TEST_DESCRIPTION(
13897 "Bind a secondary command buffer with with a framebuffer "
13898 "that does not match the framebuffer for the active "
13899 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013900 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013901 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13902
13903 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013904 VkAttachmentDescription attachment = {0,
13905 VK_FORMAT_B8G8R8A8_UNORM,
13906 VK_SAMPLE_COUNT_1_BIT,
13907 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13908 VK_ATTACHMENT_STORE_OP_STORE,
13909 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13910 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13911 VK_IMAGE_LAYOUT_UNDEFINED,
13912 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013913
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013914 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013915
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013916 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013917
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013918 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013919
13920 VkRenderPass rp;
13921 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13922 ASSERT_VK_SUCCESS(err);
13923
13924 // A compatible framebuffer.
13925 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013926 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 -060013927 ASSERT_TRUE(image.initialized());
13928
13929 VkImageViewCreateInfo ivci = {
13930 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13931 nullptr,
13932 0,
13933 image.handle(),
13934 VK_IMAGE_VIEW_TYPE_2D,
13935 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013936 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13937 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013938 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13939 };
13940 VkImageView view;
13941 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13942 ASSERT_VK_SUCCESS(err);
13943
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013944 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013945 VkFramebuffer fb;
13946 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13947 ASSERT_VK_SUCCESS(err);
13948
13949 VkCommandBufferAllocateInfo cbai = {};
13950 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013951 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013952 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13953 cbai.commandBufferCount = 1;
13954
13955 VkCommandBuffer sec_cb;
13956 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13957 ASSERT_VK_SUCCESS(err);
13958 VkCommandBufferBeginInfo cbbi = {};
13959 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013960 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013961 cbii.renderPass = renderPass();
13962 cbii.framebuffer = fb;
13963 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13964 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013965 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 -060013966 cbbi.pInheritanceInfo = &cbii;
13967 vkBeginCommandBuffer(sec_cb, &cbbi);
13968 vkEndCommandBuffer(sec_cb);
13969
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013970 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013971 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13972 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013973
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013975 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013976 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13977 m_errorMonitor->VerifyFound();
13978 // Cleanup
13979 vkDestroyImageView(m_device->device(), view, NULL);
13980 vkDestroyRenderPass(m_device->device(), rp, NULL);
13981 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13982}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013983
13984TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013985 TEST_DESCRIPTION(
13986 "If logicOp is available on the device, set it to an "
13987 "invalid value. If logicOp is not available, attempt to "
13988 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013989 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013990 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13991
13992 auto features = m_device->phy().features();
13993 // Set the expected error depending on whether or not logicOp available
13994 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13996 "If logic operations feature not "
13997 "enabled, logicOpEnable must be "
13998 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013999 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130014000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014001 }
14002 // Create a pipeline using logicOp
14003 VkResult err;
14004
14005 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
14006 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14007
14008 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014009 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014010 ASSERT_VK_SUCCESS(err);
14011
14012 VkPipelineViewportStateCreateInfo vp_state_ci = {};
14013 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
14014 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014015 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014016 vp_state_ci.pViewports = &vp;
14017 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014018 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014019 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014020
14021 VkPipelineShaderStageCreateInfo shaderStages[2];
14022 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
14023
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014024 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
14025 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014026 shaderStages[0] = vs.GetStageCreateInfo();
14027 shaderStages[1] = fs.GetStageCreateInfo();
14028
14029 VkPipelineVertexInputStateCreateInfo vi_ci = {};
14030 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
14031
14032 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
14033 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
14034 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
14035
14036 VkPipelineRasterizationStateCreateInfo rs_ci = {};
14037 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130014038 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014039
14040 VkPipelineColorBlendAttachmentState att = {};
14041 att.blendEnable = VK_FALSE;
14042 att.colorWriteMask = 0xf;
14043
14044 VkPipelineColorBlendStateCreateInfo cb_ci = {};
14045 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
14046 // Enable logicOp & set logicOp to value 1 beyond allowed entries
14047 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014048 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014049 cb_ci.attachmentCount = 1;
14050 cb_ci.pAttachments = &att;
14051
Chris Forbes8aeacbf2016-10-03 14:25:08 +130014052 VkPipelineMultisampleStateCreateInfo ms_ci = {};
14053 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
14054 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
14055
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014056 VkGraphicsPipelineCreateInfo gp_ci = {};
14057 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14058 gp_ci.stageCount = 2;
14059 gp_ci.pStages = shaderStages;
14060 gp_ci.pVertexInputState = &vi_ci;
14061 gp_ci.pInputAssemblyState = &ia_ci;
14062 gp_ci.pViewportState = &vp_state_ci;
14063 gp_ci.pRasterizationState = &rs_ci;
14064 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130014065 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014066 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14067 gp_ci.layout = pipeline_layout;
14068 gp_ci.renderPass = renderPass();
14069
14070 VkPipelineCacheCreateInfo pc_ci = {};
14071 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14072
14073 VkPipeline pipeline;
14074 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014075 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014076 ASSERT_VK_SUCCESS(err);
14077
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014078 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014079 m_errorMonitor->VerifyFound();
14080 if (VK_SUCCESS == err) {
14081 vkDestroyPipeline(m_device->device(), pipeline, NULL);
14082 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014083 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
14084 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
14085}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014086
Mike Stroyanaccf7692015-05-12 16:00:45 -060014087#if GTEST_IS_THREADSAFE
14088struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014089 VkCommandBuffer commandBuffer;
Mike Stroyanca855662017-05-02 11:06:27 -060014090 VkDevice device;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014091 VkEvent event;
14092 bool bailout;
14093};
14094
Karl Schultz6addd812016-02-02 17:17:23 -070014095extern "C" void *AddToCommandBuffer(void *arg) {
14096 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014097
Mike Stroyana6d14942016-07-13 15:10:05 -060014098 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014099 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014100 if (data->bailout) {
14101 break;
14102 }
14103 }
14104 return NULL;
14105}
14106
Karl Schultz6addd812016-02-02 17:17:23 -070014107TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014108 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014109
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014111
Tony Barbour1fa09702017-03-16 12:09:08 -060014112 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060014113 ASSERT_NO_FATAL_FAILURE(InitViewport());
14114 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14115
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014116 // Calls AllocateCommandBuffers
14117 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014118
14119 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014120 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014121
14122 VkEventCreateInfo event_info;
14123 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014124 VkResult err;
14125
14126 memset(&event_info, 0, sizeof(event_info));
14127 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
14128
Chia-I Wuf7458c52015-10-26 21:10:41 +080014129 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014130 ASSERT_VK_SUCCESS(err);
14131
Mike Stroyanaccf7692015-05-12 16:00:45 -060014132 err = vkResetEvent(device(), event);
14133 ASSERT_VK_SUCCESS(err);
14134
14135 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014136 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014137 data.event = event;
14138 data.bailout = false;
14139 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060014140
14141 // First do some correct operations using multiple threads.
14142 // Add many entries to command buffer from another thread.
14143 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
14144 // Make non-conflicting calls from this thread at the same time.
14145 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060014146 uint32_t count;
14147 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060014148 }
14149 test_platform_thread_join(thread, NULL);
14150
14151 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060014152 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014153 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014154 // Add many entries to command buffer from this thread at the same time.
14155 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014156
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014157 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014158 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014159
Mike Stroyan10b8cb72016-01-22 15:22:03 -070014160 m_errorMonitor->SetBailout(NULL);
14161
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014162 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014163
Chia-I Wuf7458c52015-10-26 21:10:41 +080014164 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014165}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014166#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014167
Karl Schultz6addd812016-02-02 17:17:23 -070014168TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014169 TEST_DESCRIPTION("Test that errors are produced for a spirv modules with invalid code sizes");
Chris Forbes1cc79542016-07-20 11:13:44 +120014170
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014172
Tony Barbour1fa09702017-03-16 12:09:08 -060014173 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014174 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14175
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014176 VkShaderModule module;
14177 VkShaderModuleCreateInfo moduleCreateInfo;
14178 struct icd_spv_header spv;
14179
14180 spv.magic = ICD_SPV_MAGIC;
14181 spv.version = ICD_SPV_VERSION;
14182 spv.gen_magic = 0;
14183
14184 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14185 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014186 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014187 moduleCreateInfo.codeSize = 4;
14188 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014189 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014190
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014191 m_errorMonitor->VerifyFound();
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014192
14193 char const *vsSource =
14194 "#version 450\n"
14195 "\n"
14196 "layout(location=0) out float x;\n"
14197 "out gl_PerVertex {\n"
14198 " vec4 gl_Position;\n"
14199 "};\n"
14200 "void main(){\n"
14201 " gl_Position = vec4(1);\n"
14202 " x = 0;\n"
14203 "}\n";
14204
14205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02816);
14206 std::vector<unsigned int> shader;
14207 VkShaderModuleCreateInfo module_create_info;
14208 VkShaderModule shader_module;
14209 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14210 module_create_info.pNext = NULL;
14211 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, shader);
14212 module_create_info.pCode = shader.data();
14213 // Introduce failure by making codeSize a non-multiple of 4
14214 module_create_info.codeSize = shader.size() * sizeof(unsigned int) - 1;
14215 module_create_info.flags = 0;
14216 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
14217
14218 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014219}
14220
Karl Schultz6addd812016-02-02 17:17:23 -070014221TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014222 TEST_DESCRIPTION(
14223 "Test that an error is produced for a spirv module "
14224 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120014225
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014227
Tony Barbour1fa09702017-03-16 12:09:08 -060014228 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014229 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14230
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014231 VkShaderModule module;
14232 VkShaderModuleCreateInfo moduleCreateInfo;
14233 struct icd_spv_header spv;
14234
14235 spv.magic = ~ICD_SPV_MAGIC;
14236 spv.version = ICD_SPV_VERSION;
14237 spv.gen_magic = 0;
14238
14239 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14240 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014241 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014242 moduleCreateInfo.codeSize = sizeof(spv) + 16;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014243 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014244 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014245
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014246 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014247}
14248
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014249#if 0
14250// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070014251TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014253 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014254
Tony Barbour1fa09702017-03-16 12:09:08 -060014255 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014256 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14257
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014258 VkShaderModule module;
14259 VkShaderModuleCreateInfo moduleCreateInfo;
14260 struct icd_spv_header spv;
14261
14262 spv.magic = ICD_SPV_MAGIC;
14263 spv.version = ~ICD_SPV_VERSION;
14264 spv.gen_magic = 0;
14265
14266 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14267 moduleCreateInfo.pNext = NULL;
14268
Karl Schultz6addd812016-02-02 17:17:23 -070014269 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014270 moduleCreateInfo.codeSize = sizeof(spv) + 10;
14271 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014272 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014273
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014274 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014275}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014276#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014277
Karl Schultz6addd812016-02-02 17:17:23 -070014278TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014279 TEST_DESCRIPTION(
14280 "Test that a warning is produced for a vertex output that "
14281 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014283
Tony Barbour1fa09702017-03-16 12:09:08 -060014284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014286
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014287 char const *vsSource =
14288 "#version 450\n"
14289 "\n"
14290 "layout(location=0) out float x;\n"
14291 "out gl_PerVertex {\n"
14292 " vec4 gl_Position;\n"
14293 "};\n"
14294 "void main(){\n"
14295 " gl_Position = vec4(1);\n"
14296 " x = 0;\n"
14297 "}\n";
14298 char const *fsSource =
14299 "#version 450\n"
14300 "\n"
14301 "layout(location=0) out vec4 color;\n"
14302 "void main(){\n"
14303 " color = vec4(1);\n"
14304 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120014305
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014306 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14307 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014308
14309 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014310 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014311 pipe.AddShader(&vs);
14312 pipe.AddShader(&fs);
14313
Chris Forbes9f7ff632015-05-25 11:13:08 +120014314 VkDescriptorSetObj descriptorSet(m_device);
14315 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014316 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014317
Tony Barbour5781e8f2015-08-04 16:23:11 -060014318 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014319
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014320 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014321}
Chris Forbes9f7ff632015-05-25 11:13:08 +120014322
Mark Mueller098c9cb2016-09-08 09:01:57 -060014323TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
14324 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14325
Tony Barbour1fa09702017-03-16 12:09:08 -060014326 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14328
14329 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014330 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014331
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014332 char const *vsSource =
14333 "#version 450\n"
14334 "\n"
14335 "out gl_PerVertex {\n"
14336 " vec4 gl_Position;\n"
14337 "};\n"
14338 "void main(){\n"
14339 " gl_Position = vec4(1);\n"
14340 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014341
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014342 char const *fsSource =
14343 "#version 450\n"
14344 "\n"
14345 "layout (constant_id = 0) const float r = 0.0f;\n"
14346 "layout(location = 0) out vec4 uFragColor;\n"
14347 "void main(){\n"
14348 " uFragColor = vec4(r,1,0,1);\n"
14349 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014350
14351 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14352 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14353
14354 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14355 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14356
14357 VkPipelineLayout pipeline_layout;
14358 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14359
14360 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
14361 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
14362 vp_state_create_info.viewportCount = 1;
14363 VkViewport viewport = {};
14364 vp_state_create_info.pViewports = &viewport;
14365 vp_state_create_info.scissorCount = 1;
14366 VkRect2D scissors = {};
14367 vp_state_create_info.pScissors = &scissors;
14368
14369 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
14370
14371 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
14372 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
14373 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
14374 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
14375
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014376 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060014377
14378 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
14379 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
14380
14381 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
14382 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
14383 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
14384
14385 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
14386 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
14387 rasterization_state_create_info.pNext = nullptr;
14388 rasterization_state_create_info.lineWidth = 1.0f;
14389 rasterization_state_create_info.rasterizerDiscardEnable = true;
14390
14391 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
14392 color_blend_attachment_state.blendEnable = VK_FALSE;
14393 color_blend_attachment_state.colorWriteMask = 0xf;
14394
14395 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
14396 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
14397 color_blend_state_create_info.attachmentCount = 1;
14398 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
14399
14400 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
14401 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14402 graphicspipe_create_info.stageCount = 2;
14403 graphicspipe_create_info.pStages = shader_stage_create_info;
14404 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
14405 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
14406 graphicspipe_create_info.pViewportState = &vp_state_create_info;
14407 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
14408 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
14409 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
14410 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14411 graphicspipe_create_info.layout = pipeline_layout;
14412 graphicspipe_create_info.renderPass = renderPass();
14413
14414 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
14415 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14416
14417 VkPipelineCache pipelineCache;
14418 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
14419
14420 // This structure maps constant ids to data locations.
14421 const VkSpecializationMapEntry entry =
14422 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014423 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014424
14425 uint32_t data = 1;
14426
14427 // Set up the info describing spec map and data
14428 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014429 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060014430 };
14431 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
14432
14433 VkPipeline pipeline;
14434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
14435 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
14436 m_errorMonitor->VerifyFound();
14437
14438 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
14439 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14440}
14441
14442TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
14443 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14444
Tony Barbour1fa09702017-03-16 12:09:08 -060014445 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014446 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14447
14448 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
14449
14450 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
14451 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14452 descriptor_pool_type_count[0].descriptorCount = 1;
14453 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14454 descriptor_pool_type_count[1].descriptorCount = 1;
14455
14456 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14457 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14458 descriptor_pool_create_info.maxSets = 1;
14459 descriptor_pool_create_info.poolSizeCount = 2;
14460 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
14461 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14462
14463 VkDescriptorPool descriptorset_pool;
14464 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14465
14466 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14467 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14468 descriptorset_layout_binding.descriptorCount = 1;
14469 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070014470 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014471
14472 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14473 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14474 descriptorset_layout_create_info.bindingCount = 1;
14475 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14476
14477 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014478 ASSERT_VK_SUCCESS(
14479 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014480
14481 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14482 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14483 descriptorset_allocate_info.descriptorSetCount = 1;
14484 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14485 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14486 VkDescriptorSet descriptorset;
14487 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14488
14489 // Challenge core_validation with a non uniform buffer type.
14490 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
14491
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014492 char const *vsSource =
14493 "#version 450\n"
14494 "\n"
14495 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14496 " mat4 mvp;\n"
14497 "} ubuf;\n"
14498 "out gl_PerVertex {\n"
14499 " vec4 gl_Position;\n"
14500 "};\n"
14501 "void main(){\n"
14502 " gl_Position = ubuf.mvp * vec4(1);\n"
14503 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014504
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014505 char const *fsSource =
14506 "#version 450\n"
14507 "\n"
14508 "layout(location = 0) out vec4 uFragColor;\n"
14509 "void main(){\n"
14510 " uFragColor = vec4(0,1,0,1);\n"
14511 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014512
14513 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14514 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14515
14516 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14517 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14518 pipeline_layout_create_info.setLayoutCount = 1;
14519 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14520
14521 VkPipelineLayout pipeline_layout;
14522 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14523
14524 VkPipelineObj pipe(m_device);
14525 pipe.AddColorAttachment();
14526 pipe.AddShader(&vs);
14527 pipe.AddShader(&fs);
14528
14529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
14530 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14531 m_errorMonitor->VerifyFound();
14532
14533 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14534 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14535 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14536}
14537
14538TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
14539 TEST_DESCRIPTION(
14540 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
14541
Tony Barbour1fa09702017-03-16 12:09:08 -060014542 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14544
14545 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
14546
14547 VkDescriptorPoolSize descriptor_pool_type_count = {};
14548 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14549 descriptor_pool_type_count.descriptorCount = 1;
14550
14551 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14552 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14553 descriptor_pool_create_info.maxSets = 1;
14554 descriptor_pool_create_info.poolSizeCount = 1;
14555 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
14556 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14557
14558 VkDescriptorPool descriptorset_pool;
14559 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14560
14561 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14562 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14563 descriptorset_layout_binding.descriptorCount = 1;
14564 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
14565 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070014566 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014567
14568 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14569 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14570 descriptorset_layout_create_info.bindingCount = 1;
14571 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14572
14573 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014574 ASSERT_VK_SUCCESS(
14575 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014576
14577 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14578 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14579 descriptorset_allocate_info.descriptorSetCount = 1;
14580 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14581 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14582 VkDescriptorSet descriptorset;
14583 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14584
14585 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
14586
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014587 char const *vsSource =
14588 "#version 450\n"
14589 "\n"
14590 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14591 " mat4 mvp;\n"
14592 "} ubuf;\n"
14593 "out gl_PerVertex {\n"
14594 " vec4 gl_Position;\n"
14595 "};\n"
14596 "void main(){\n"
14597 " gl_Position = ubuf.mvp * vec4(1);\n"
14598 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014599
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014600 char const *fsSource =
14601 "#version 450\n"
14602 "\n"
14603 "layout(location = 0) out vec4 uFragColor;\n"
14604 "void main(){\n"
14605 " uFragColor = vec4(0,1,0,1);\n"
14606 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014607
14608 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14609 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14610
14611 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14612 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14613 pipeline_layout_create_info.setLayoutCount = 1;
14614 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14615
14616 VkPipelineLayout pipeline_layout;
14617 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14618
14619 VkPipelineObj pipe(m_device);
14620 pipe.AddColorAttachment();
14621 pipe.AddShader(&vs);
14622 pipe.AddShader(&fs);
14623
14624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14625 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14626 m_errorMonitor->VerifyFound();
14627
14628 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14629 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14630 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14631}
14632
14633TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014634 TEST_DESCRIPTION(
14635 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14636 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014637
Tony Barbour1fa09702017-03-16 12:09:08 -060014638 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014639 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14640
14641 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014642 "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 -060014643
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014644 char const *vsSource =
14645 "#version 450\n"
14646 "\n"
14647 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14648 "out gl_PerVertex {\n"
14649 " vec4 gl_Position;\n"
14650 "};\n"
14651 "void main(){\n"
14652 " gl_Position = vec4(consts.x);\n"
14653 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014654
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014655 char const *fsSource =
14656 "#version 450\n"
14657 "\n"
14658 "layout(location = 0) out vec4 uFragColor;\n"
14659 "void main(){\n"
14660 " uFragColor = vec4(0,1,0,1);\n"
14661 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014662
14663 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14664 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14665
14666 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14667 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14668
14669 // Set up a push constant range
14670 VkPushConstantRange push_constant_ranges = {};
14671 // Set to the wrong stage to challenge core_validation
14672 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14673 push_constant_ranges.size = 4;
14674
14675 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14676 pipeline_layout_create_info.pushConstantRangeCount = 1;
14677
14678 VkPipelineLayout pipeline_layout;
14679 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14680
14681 VkPipelineObj pipe(m_device);
14682 pipe.AddColorAttachment();
14683 pipe.AddShader(&vs);
14684 pipe.AddShader(&fs);
14685
14686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14687 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14688 m_errorMonitor->VerifyFound();
14689
14690 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14691}
14692
14693TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14694 TEST_DESCRIPTION(
14695 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14696
Tony Barbour1fa09702017-03-16 12:09:08 -060014697 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014698 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14699
14700 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014701 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014702
14703 // Some awkward steps are required to test with custom device features.
14704 std::vector<const char *> device_extension_names;
14705 auto features = m_device->phy().features();
14706 // Disable support for 64 bit floats
14707 features.shaderFloat64 = false;
14708 // The sacrificial device object
14709 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14710
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014711 char const *vsSource =
14712 "#version 450\n"
14713 "\n"
14714 "out gl_PerVertex {\n"
14715 " vec4 gl_Position;\n"
14716 "};\n"
14717 "void main(){\n"
14718 " gl_Position = vec4(1);\n"
14719 "}\n";
14720 char const *fsSource =
14721 "#version 450\n"
14722 "\n"
14723 "layout(location=0) out vec4 color;\n"
14724 "void main(){\n"
14725 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14726 " color = vec4(green);\n"
14727 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014728
14729 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14730 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14731
14732 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014733
14734 VkPipelineObj pipe(&test_device);
14735 pipe.AddColorAttachment();
14736 pipe.AddShader(&vs);
14737 pipe.AddShader(&fs);
14738
14739 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14740 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14741 VkPipelineLayout pipeline_layout;
14742 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14743
14744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14745 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14746 m_errorMonitor->VerifyFound();
14747
14748 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14749}
14750
Mark Lobodzinski20832822017-03-24 14:49:45 -060014751TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14752 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14753 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014754
Tony Barbour1fa09702017-03-16 12:09:08 -060014755 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014756 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14757
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014758 char const *vsSource =
14759 "#version 450\n"
14760 "\n"
14761 "out gl_PerVertex {\n"
14762 " vec4 gl_Position;\n"
14763 "};\n"
14764 "layout(xfb_buffer = 1) out;"
14765 "void main(){\n"
14766 " gl_Position = vec4(1);\n"
14767 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014768
Mark Lobodzinski20832822017-03-24 14:49:45 -060014769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014770
Mark Lobodzinski20832822017-03-24 14:49:45 -060014771 std::vector<unsigned int> spv;
14772 VkShaderModuleCreateInfo module_create_info;
14773 VkShaderModule shader_module;
14774 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14775 module_create_info.pNext = NULL;
14776 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14777 module_create_info.pCode = spv.data();
14778 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14779 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014780
Mark Lobodzinski20832822017-03-24 14:49:45 -060014781 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014782
Mark Lobodzinski20832822017-03-24 14:49:45 -060014783 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014784}
14785
Karl Schultz6addd812016-02-02 17:17:23 -070014786TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014787 TEST_DESCRIPTION(
14788 "Test that an error is produced for a fragment shader input "
14789 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014790
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014792
Tony Barbour1fa09702017-03-16 12:09:08 -060014793 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014794 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014795
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014796 char const *vsSource =
14797 "#version 450\n"
14798 "\n"
14799 "out gl_PerVertex {\n"
14800 " vec4 gl_Position;\n"
14801 "};\n"
14802 "void main(){\n"
14803 " gl_Position = vec4(1);\n"
14804 "}\n";
14805 char const *fsSource =
14806 "#version 450\n"
14807 "\n"
14808 "layout(location=0) in float x;\n"
14809 "layout(location=0) out vec4 color;\n"
14810 "void main(){\n"
14811 " color = vec4(x);\n"
14812 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014813
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014814 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14815 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014816
14817 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014818 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014819 pipe.AddShader(&vs);
14820 pipe.AddShader(&fs);
14821
Chris Forbes59cb88d2015-05-25 11:13:13 +120014822 VkDescriptorSetObj descriptorSet(m_device);
14823 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014824 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014825
Tony Barbour5781e8f2015-08-04 16:23:11 -060014826 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014827
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014828 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014829}
14830
Karl Schultz6addd812016-02-02 17:17:23 -070014831TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014832 TEST_DESCRIPTION(
14833 "Test that an error is produced for a fragment shader input "
14834 "within an interace block, which is not present in the outputs "
14835 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014837
Tony Barbour1fa09702017-03-16 12:09:08 -060014838 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014839 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14840
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014841 char const *vsSource =
14842 "#version 450\n"
14843 "\n"
14844 "out gl_PerVertex {\n"
14845 " vec4 gl_Position;\n"
14846 "};\n"
14847 "void main(){\n"
14848 " gl_Position = vec4(1);\n"
14849 "}\n";
14850 char const *fsSource =
14851 "#version 450\n"
14852 "\n"
14853 "in block { layout(location=0) float x; } ins;\n"
14854 "layout(location=0) out vec4 color;\n"
14855 "void main(){\n"
14856 " color = vec4(ins.x);\n"
14857 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014858
14859 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14860 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14861
14862 VkPipelineObj pipe(m_device);
14863 pipe.AddColorAttachment();
14864 pipe.AddShader(&vs);
14865 pipe.AddShader(&fs);
14866
14867 VkDescriptorSetObj descriptorSet(m_device);
14868 descriptorSet.AppendDummy();
14869 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14870
14871 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14872
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014873 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014874}
14875
Karl Schultz6addd812016-02-02 17:17:23 -070014876TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014877 TEST_DESCRIPTION(
14878 "Test that an error is produced for mismatched array sizes "
14879 "across the vertex->fragment shader interface");
14880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14881 "Type mismatch on location 0.0: 'ptr to "
14882 "output arr[2] of float32' vs 'ptr to "
14883 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014884
Tony Barbour1fa09702017-03-16 12:09:08 -060014885 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14887
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014888 char const *vsSource =
14889 "#version 450\n"
14890 "\n"
14891 "layout(location=0) out float x[2];\n"
14892 "out gl_PerVertex {\n"
14893 " vec4 gl_Position;\n"
14894 "};\n"
14895 "void main(){\n"
14896 " x[0] = 0; x[1] = 0;\n"
14897 " gl_Position = vec4(1);\n"
14898 "}\n";
14899 char const *fsSource =
14900 "#version 450\n"
14901 "\n"
14902 "layout(location=0) in float x[1];\n"
14903 "layout(location=0) out vec4 color;\n"
14904 "void main(){\n"
14905 " color = vec4(x[0]);\n"
14906 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014907
14908 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14909 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14910
14911 VkPipelineObj pipe(m_device);
14912 pipe.AddColorAttachment();
14913 pipe.AddShader(&vs);
14914 pipe.AddShader(&fs);
14915
14916 VkDescriptorSetObj descriptorSet(m_device);
14917 descriptorSet.AppendDummy();
14918 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14919
14920 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14921
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014922 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014923}
14924
Karl Schultz6addd812016-02-02 17:17:23 -070014925TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014926 TEST_DESCRIPTION(
14927 "Test that an error is produced for mismatched types across "
14928 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014930
Tony Barbour1fa09702017-03-16 12:09:08 -060014931 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014932 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014933
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014934 char const *vsSource =
14935 "#version 450\n"
14936 "\n"
14937 "layout(location=0) out int x;\n"
14938 "out gl_PerVertex {\n"
14939 " vec4 gl_Position;\n"
14940 "};\n"
14941 "void main(){\n"
14942 " x = 0;\n"
14943 " gl_Position = vec4(1);\n"
14944 "}\n";
14945 char const *fsSource =
14946 "#version 450\n"
14947 "\n"
14948 "layout(location=0) in float x;\n" /* VS writes int */
14949 "layout(location=0) out vec4 color;\n"
14950 "void main(){\n"
14951 " color = vec4(x);\n"
14952 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014953
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014954 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14955 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014956
14957 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014958 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014959 pipe.AddShader(&vs);
14960 pipe.AddShader(&fs);
14961
Chris Forbesb56af562015-05-25 11:13:17 +120014962 VkDescriptorSetObj descriptorSet(m_device);
14963 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014964 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014965
Tony Barbour5781e8f2015-08-04 16:23:11 -060014966 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014967
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014968 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014969}
14970
Karl Schultz6addd812016-02-02 17:17:23 -070014971TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014972 TEST_DESCRIPTION(
14973 "Test that an error is produced for mismatched types across "
14974 "the vertex->fragment shader interface, when the variable is contained within "
14975 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014977
Tony Barbour1fa09702017-03-16 12:09:08 -060014978 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014979 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14980
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014981 char const *vsSource =
14982 "#version 450\n"
14983 "\n"
14984 "out block { layout(location=0) int x; } outs;\n"
14985 "out gl_PerVertex {\n"
14986 " vec4 gl_Position;\n"
14987 "};\n"
14988 "void main(){\n"
14989 " outs.x = 0;\n"
14990 " gl_Position = vec4(1);\n"
14991 "}\n";
14992 char const *fsSource =
14993 "#version 450\n"
14994 "\n"
14995 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14996 "layout(location=0) out vec4 color;\n"
14997 "void main(){\n"
14998 " color = vec4(ins.x);\n"
14999 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130015000
15001 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15002 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15003
15004 VkPipelineObj pipe(m_device);
15005 pipe.AddColorAttachment();
15006 pipe.AddShader(&vs);
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 Forbese9928822016-02-17 14:44:52 +130015016}
15017
15018TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015019 TEST_DESCRIPTION(
15020 "Test that an error is produced for location mismatches across "
15021 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
15022 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015023 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 +130015024
Tony Barbour1fa09702017-03-16 12:09:08 -060015025 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130015026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15027
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015028 char const *vsSource =
15029 "#version 450\n"
15030 "\n"
15031 "out block { layout(location=1) float x; } outs;\n"
15032 "out gl_PerVertex {\n"
15033 " vec4 gl_Position;\n"
15034 "};\n"
15035 "void main(){\n"
15036 " outs.x = 0;\n"
15037 " gl_Position = vec4(1);\n"
15038 "}\n";
15039 char const *fsSource =
15040 "#version 450\n"
15041 "\n"
15042 "in block { layout(location=0) float x; } ins;\n"
15043 "layout(location=0) out vec4 color;\n"
15044 "void main(){\n"
15045 " color = vec4(ins.x);\n"
15046 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130015047
15048 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15049 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15050
15051 VkPipelineObj pipe(m_device);
15052 pipe.AddColorAttachment();
15053 pipe.AddShader(&vs);
15054 pipe.AddShader(&fs);
15055
15056 VkDescriptorSetObj descriptorSet(m_device);
15057 descriptorSet.AppendDummy();
15058 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15059
15060 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15061
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015062 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130015063}
15064
15065TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015066 TEST_DESCRIPTION(
15067 "Test that an error is produced for component mismatches across the "
15068 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
15069 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015070 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 +130015071
Tony Barbour1fa09702017-03-16 12:09:08 -060015072 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130015073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15074
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015075 char const *vsSource =
15076 "#version 450\n"
15077 "\n"
15078 "out block { layout(location=0, component=0) float x; } outs;\n"
15079 "out gl_PerVertex {\n"
15080 " vec4 gl_Position;\n"
15081 "};\n"
15082 "void main(){\n"
15083 " outs.x = 0;\n"
15084 " gl_Position = vec4(1);\n"
15085 "}\n";
15086 char const *fsSource =
15087 "#version 450\n"
15088 "\n"
15089 "in block { layout(location=0, component=1) float x; } ins;\n"
15090 "layout(location=0) out vec4 color;\n"
15091 "void main(){\n"
15092 " color = vec4(ins.x);\n"
15093 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130015094
15095 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15096 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15097
15098 VkPipelineObj pipe(m_device);
15099 pipe.AddColorAttachment();
15100 pipe.AddShader(&vs);
15101 pipe.AddShader(&fs);
15102
15103 VkDescriptorSetObj descriptorSet(m_device);
15104 descriptorSet.AppendDummy();
15105 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15106
15107 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15108
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015109 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130015110}
15111
Chris Forbes1f3b0152016-11-30 12:48:40 +130015112TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
15113 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
15114
Tony Barbour1fa09702017-03-16 12:09:08 -060015115 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130015116 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15117
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015118 char const *vsSource =
15119 "#version 450\n"
15120 "layout(location=0) out mediump float x;\n"
15121 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
15122 char const *fsSource =
15123 "#version 450\n"
15124 "layout(location=0) in highp float x;\n"
15125 "layout(location=0) out vec4 color;\n"
15126 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130015127
15128 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15129 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15130
15131 VkPipelineObj pipe(m_device);
15132 pipe.AddColorAttachment();
15133 pipe.AddShader(&vs);
15134 pipe.AddShader(&fs);
15135
15136 VkDescriptorSetObj descriptorSet(m_device);
15137 descriptorSet.AppendDummy();
15138 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15139
15140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15141
15142 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15143
15144 m_errorMonitor->VerifyFound();
15145}
15146
Chris Forbes870a39e2016-11-30 12:55:56 +130015147TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
15148 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
15149
Tony Barbour1fa09702017-03-16 12:09:08 -060015150 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130015151 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15152
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015153 char const *vsSource =
15154 "#version 450\n"
15155 "out block { layout(location=0) mediump float x; };\n"
15156 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
15157 char const *fsSource =
15158 "#version 450\n"
15159 "in block { layout(location=0) highp float x; };\n"
15160 "layout(location=0) out vec4 color;\n"
15161 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130015162
15163 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15164 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15165
15166 VkPipelineObj pipe(m_device);
15167 pipe.AddColorAttachment();
15168 pipe.AddShader(&vs);
15169 pipe.AddShader(&fs);
15170
15171 VkDescriptorSetObj descriptorSet(m_device);
15172 descriptorSet.AppendDummy();
15173 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15174
15175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15176
15177 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15178
15179 m_errorMonitor->VerifyFound();
15180}
15181
Karl Schultz6addd812016-02-02 17:17:23 -070015182TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015183 TEST_DESCRIPTION(
15184 "Test that a warning is produced for a vertex attribute which is "
15185 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015187
Tony Barbour1fa09702017-03-16 12:09:08 -060015188 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015189 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120015190
15191 VkVertexInputBindingDescription input_binding;
15192 memset(&input_binding, 0, sizeof(input_binding));
15193
15194 VkVertexInputAttributeDescription input_attrib;
15195 memset(&input_attrib, 0, sizeof(input_attrib));
15196 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15197
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015198 char const *vsSource =
15199 "#version 450\n"
15200 "\n"
15201 "out gl_PerVertex {\n"
15202 " vec4 gl_Position;\n"
15203 "};\n"
15204 "void main(){\n"
15205 " gl_Position = vec4(1);\n"
15206 "}\n";
15207 char const *fsSource =
15208 "#version 450\n"
15209 "\n"
15210 "layout(location=0) out vec4 color;\n"
15211 "void main(){\n"
15212 " color = vec4(1);\n"
15213 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120015214
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015215 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15216 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120015217
15218 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015219 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120015220 pipe.AddShader(&vs);
15221 pipe.AddShader(&fs);
15222
15223 pipe.AddVertexInputBindings(&input_binding, 1);
15224 pipe.AddVertexInputAttribs(&input_attrib, 1);
15225
Chris Forbesde136e02015-05-25 11:13:28 +120015226 VkDescriptorSetObj descriptorSet(m_device);
15227 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015228 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120015229
Tony Barbour5781e8f2015-08-04 16:23:11 -060015230 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120015231
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015232 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120015233}
15234
Karl Schultz6addd812016-02-02 17:17:23 -070015235TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015236 TEST_DESCRIPTION(
15237 "Test that a warning is produced for a location mismatch on "
15238 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015240
Tony Barbour1fa09702017-03-16 12:09:08 -060015241 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130015242 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15243
15244 VkVertexInputBindingDescription input_binding;
15245 memset(&input_binding, 0, sizeof(input_binding));
15246
15247 VkVertexInputAttributeDescription input_attrib;
15248 memset(&input_attrib, 0, sizeof(input_attrib));
15249 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15250
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015251 char const *vsSource =
15252 "#version 450\n"
15253 "\n"
15254 "layout(location=1) in float x;\n"
15255 "out gl_PerVertex {\n"
15256 " vec4 gl_Position;\n"
15257 "};\n"
15258 "void main(){\n"
15259 " gl_Position = vec4(x);\n"
15260 "}\n";
15261 char const *fsSource =
15262 "#version 450\n"
15263 "\n"
15264 "layout(location=0) out vec4 color;\n"
15265 "void main(){\n"
15266 " color = vec4(1);\n"
15267 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130015268
15269 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15270 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15271
15272 VkPipelineObj pipe(m_device);
15273 pipe.AddColorAttachment();
15274 pipe.AddShader(&vs);
15275 pipe.AddShader(&fs);
15276
15277 pipe.AddVertexInputBindings(&input_binding, 1);
15278 pipe.AddVertexInputAttribs(&input_attrib, 1);
15279
15280 VkDescriptorSetObj descriptorSet(m_device);
15281 descriptorSet.AppendDummy();
15282 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15283
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070015284 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015285 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15286
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015287 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130015288}
15289
Karl Schultz6addd812016-02-02 17:17:23 -070015290TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015291 TEST_DESCRIPTION(
15292 "Test that an error is produced for a vertex shader input which is not "
15293 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15295 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015296
Tony Barbour1fa09702017-03-16 12:09:08 -060015297 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015298 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120015299
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015300 char const *vsSource =
15301 "#version 450\n"
15302 "\n"
15303 "layout(location=0) in vec4 x;\n" /* not provided */
15304 "out gl_PerVertex {\n"
15305 " vec4 gl_Position;\n"
15306 "};\n"
15307 "void main(){\n"
15308 " gl_Position = x;\n"
15309 "}\n";
15310 char const *fsSource =
15311 "#version 450\n"
15312 "\n"
15313 "layout(location=0) out vec4 color;\n"
15314 "void main(){\n"
15315 " color = vec4(1);\n"
15316 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120015317
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015318 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15319 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120015320
15321 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015322 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120015323 pipe.AddShader(&vs);
15324 pipe.AddShader(&fs);
15325
Chris Forbes62e8e502015-05-25 11:13:29 +120015326 VkDescriptorSetObj descriptorSet(m_device);
15327 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015328 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120015329
Tony Barbour5781e8f2015-08-04 16:23:11 -060015330 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120015331
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015332 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120015333}
15334
Karl Schultz6addd812016-02-02 17:17:23 -070015335TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015336 TEST_DESCRIPTION(
15337 "Test that an error is produced for a mismatch between the "
15338 "fundamental type (float/int/uint) of an attribute and the "
15339 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060015340 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 -060015341
Tony Barbour1fa09702017-03-16 12:09:08 -060015342 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015343 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015344
15345 VkVertexInputBindingDescription input_binding;
15346 memset(&input_binding, 0, sizeof(input_binding));
15347
15348 VkVertexInputAttributeDescription input_attrib;
15349 memset(&input_attrib, 0, sizeof(input_attrib));
15350 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15351
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015352 char const *vsSource =
15353 "#version 450\n"
15354 "\n"
15355 "layout(location=0) in int x;\n" /* attrib provided float */
15356 "out gl_PerVertex {\n"
15357 " vec4 gl_Position;\n"
15358 "};\n"
15359 "void main(){\n"
15360 " gl_Position = vec4(x);\n"
15361 "}\n";
15362 char const *fsSource =
15363 "#version 450\n"
15364 "\n"
15365 "layout(location=0) out vec4 color;\n"
15366 "void main(){\n"
15367 " color = vec4(1);\n"
15368 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120015369
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015370 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15371 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015372
15373 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015374 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015375 pipe.AddShader(&vs);
15376 pipe.AddShader(&fs);
15377
15378 pipe.AddVertexInputBindings(&input_binding, 1);
15379 pipe.AddVertexInputAttribs(&input_attrib, 1);
15380
Chris Forbesc97d98e2015-05-25 11:13:31 +120015381 VkDescriptorSetObj descriptorSet(m_device);
15382 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015383 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015384
Tony Barbour5781e8f2015-08-04 16:23:11 -060015385 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015386
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015387 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015388}
15389
Chris Forbesc68b43c2016-04-06 11:18:47 +120015390TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015391 TEST_DESCRIPTION(
15392 "Test that an error is produced for a pipeline containing multiple "
15393 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15395 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120015396
Tony Barbour1fa09702017-03-16 12:09:08 -060015397 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120015398 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15399
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015400 char const *vsSource =
15401 "#version 450\n"
15402 "\n"
15403 "out gl_PerVertex {\n"
15404 " vec4 gl_Position;\n"
15405 "};\n"
15406 "void main(){\n"
15407 " gl_Position = vec4(1);\n"
15408 "}\n";
15409 char const *fsSource =
15410 "#version 450\n"
15411 "\n"
15412 "layout(location=0) out vec4 color;\n"
15413 "void main(){\n"
15414 " color = vec4(1);\n"
15415 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120015416
15417 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15418 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15419
15420 VkPipelineObj pipe(m_device);
15421 pipe.AddColorAttachment();
15422 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015423 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120015424 pipe.AddShader(&fs);
15425
15426 VkDescriptorSetObj descriptorSet(m_device);
15427 descriptorSet.AppendDummy();
15428 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15429
15430 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15431
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015432 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120015433}
15434
Chris Forbes82ff92a2016-09-09 10:50:24 +120015435TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120015437
Tony Barbour1fa09702017-03-16 12:09:08 -060015438 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120015439 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15440
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015441 char const *vsSource =
15442 "#version 450\n"
15443 "out gl_PerVertex {\n"
15444 " vec4 gl_Position;\n"
15445 "};\n"
15446 "void main(){\n"
15447 " gl_Position = vec4(0);\n"
15448 "}\n";
15449 char const *fsSource =
15450 "#version 450\n"
15451 "\n"
15452 "layout(location=0) out vec4 color;\n"
15453 "void main(){\n"
15454 " color = vec4(1);\n"
15455 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120015456
15457 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15458 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
15459
15460 VkPipelineObj pipe(m_device);
15461 pipe.AddColorAttachment();
15462 pipe.AddShader(&vs);
15463 pipe.AddShader(&fs);
15464
15465 VkDescriptorSetObj descriptorSet(m_device);
15466 descriptorSet.AppendDummy();
15467 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15468
15469 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15470
15471 m_errorMonitor->VerifyFound();
15472}
15473
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015474TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15476 "pDepthStencilState is NULL when rasterization is enabled and subpass "
15477 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015478
Tony Barbour1fa09702017-03-16 12:09:08 -060015479 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15481
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015482 char const *vsSource =
15483 "#version 450\n"
15484 "void main(){ gl_Position = vec4(0); }\n";
15485 char const *fsSource =
15486 "#version 450\n"
15487 "\n"
15488 "layout(location=0) out vec4 color;\n"
15489 "void main(){\n"
15490 " color = vec4(1);\n"
15491 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015492
15493 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15494 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15495
15496 VkPipelineObj pipe(m_device);
15497 pipe.AddColorAttachment();
15498 pipe.AddShader(&vs);
15499 pipe.AddShader(&fs);
15500
15501 VkDescriptorSetObj descriptorSet(m_device);
15502 descriptorSet.AppendDummy();
15503 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15504
15505 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015506 {
15507 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15508 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15509 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015510 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015511 {
15512 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15513 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15514 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015515 },
15516 };
15517 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015518 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015519 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015520 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
15521 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015522 VkRenderPass rp;
15523 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15524 ASSERT_VK_SUCCESS(err);
15525
15526 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
15527
15528 m_errorMonitor->VerifyFound();
15529
15530 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15531}
15532
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015533TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015534 TEST_DESCRIPTION(
15535 "Test that an error is produced for a variable output from "
15536 "the TCS without the patch decoration, but consumed in the TES "
15537 "with the decoration.");
15538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15539 "is per-vertex in tessellation control shader stage "
15540 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120015541
Tony Barbour1fa09702017-03-16 12:09:08 -060015542 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120015543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15544
Chris Forbesc1e852d2016-04-04 19:26:42 +120015545 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070015546 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120015547 return;
15548 }
15549
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015550 char const *vsSource =
15551 "#version 450\n"
15552 "void main(){}\n";
15553 char const *tcsSource =
15554 "#version 450\n"
15555 "layout(location=0) out int x[];\n"
15556 "layout(vertices=3) out;\n"
15557 "void main(){\n"
15558 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15559 " gl_TessLevelInner[0] = 1;\n"
15560 " x[gl_InvocationID] = gl_InvocationID;\n"
15561 "}\n";
15562 char const *tesSource =
15563 "#version 450\n"
15564 "layout(triangles, equal_spacing, cw) in;\n"
15565 "layout(location=0) patch in int x;\n"
15566 "out gl_PerVertex { vec4 gl_Position; };\n"
15567 "void main(){\n"
15568 " gl_Position.xyz = gl_TessCoord;\n"
15569 " gl_Position.w = x;\n"
15570 "}\n";
15571 char const *fsSource =
15572 "#version 450\n"
15573 "layout(location=0) out vec4 color;\n"
15574 "void main(){\n"
15575 " color = vec4(1);\n"
15576 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120015577
15578 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15579 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15580 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15581 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15582
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015583 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15584 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015585
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015586 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015587
15588 VkPipelineObj pipe(m_device);
15589 pipe.SetInputAssembly(&iasci);
15590 pipe.SetTessellation(&tsci);
15591 pipe.AddColorAttachment();
15592 pipe.AddShader(&vs);
15593 pipe.AddShader(&tcs);
15594 pipe.AddShader(&tes);
15595 pipe.AddShader(&fs);
15596
15597 VkDescriptorSetObj descriptorSet(m_device);
15598 descriptorSet.AppendDummy();
15599 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15600
15601 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15602
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015603 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015604}
15605
Cort Stratton2bcca1b2017-05-05 16:02:35 -070015606TEST_F(VkLayerTest, CreatePipelineTessErrors) {
15607 TEST_DESCRIPTION("Test various errors when creating a graphics pipeline with tessellation stages active.");
15608
15609 ASSERT_NO_FATAL_FAILURE(Init());
15610 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15611
15612 if (!m_device->phy().features().tessellationShader) {
15613 printf(" Device does not support tessellation shaders; skipped.\n");
15614 return;
15615 }
15616
15617 char const *vsSource =
15618 "#version 450\n"
15619 "void main(){}\n";
15620 char const *tcsSource =
15621 "#version 450\n"
15622 "layout(vertices=3) out;\n"
15623 "void main(){\n"
15624 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15625 " gl_TessLevelInner[0] = 1;\n"
15626 "}\n";
15627 char const *tesSource =
15628 "#version 450\n"
15629 "layout(triangles, equal_spacing, cw) in;\n"
15630 "out gl_PerVertex { vec4 gl_Position; };\n"
15631 "void main(){\n"
15632 " gl_Position.xyz = gl_TessCoord;\n"
15633 " gl_Position.w = 0;\n"
15634 "}\n";
15635 char const *fsSource =
15636 "#version 450\n"
15637 "layout(location=0) out vec4 color;\n"
15638 "void main(){\n"
15639 " color = vec4(1);\n"
15640 "}\n";
15641
15642 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15643 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15644 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15645 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15646
15647 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15648 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
15649
15650 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
15651
15652 VkDescriptorSetObj descriptorSet(m_device);
15653 descriptorSet.AppendDummy();
15654 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15655
15656 {
15657 VkPipelineObj pipe(m_device);
15658 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15659 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15660 pipe.SetInputAssembly(&iasci_bad);
15661 pipe.AddColorAttachment();
15662 pipe.AddShader(&vs);
15663 pipe.AddShader(&fs);
15664
15665 // Pass a tess control shader without a tess eval shader
15666 pipe.AddShader(&tcs);
15667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00534);
15668 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15669 m_errorMonitor->VerifyFound();
15670 }
15671
15672 {
15673 VkPipelineObj pipe(m_device);
15674 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15675 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15676 pipe.SetInputAssembly(&iasci_bad);
15677 pipe.AddColorAttachment();
15678 pipe.AddShader(&vs);
15679 pipe.AddShader(&fs);
15680
15681 // Pass a tess eval shader without a tess control shader
15682 pipe.AddShader(&tes);
15683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00535);
15684 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15685 m_errorMonitor->VerifyFound();
15686 }
15687
15688 {
15689 VkPipelineObj pipe(m_device);
15690 pipe.SetInputAssembly(&iasci);
15691 pipe.AddColorAttachment();
15692 pipe.AddShader(&vs);
15693 pipe.AddShader(&fs);
15694
15695 // Pass patch topology without tessellation shaders
15696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02100);
15697 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15698 m_errorMonitor->VerifyFound();
15699
15700 pipe.AddShader(&tcs);
15701 pipe.AddShader(&tes);
15702 // Pass a NULL pTessellationState (with active tessellation shader stages)
15703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00536);
15704 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15705 m_errorMonitor->VerifyFound();
15706
15707 // Pass an invalid pTessellationState (bad sType)
15708 VkPipelineTessellationStateCreateInfo tsci_bad = tsci;
15709 tsci_bad.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
15710 pipe.SetTessellation(&tsci_bad);
15711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01427);
15712 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15713 m_errorMonitor->VerifyFound();
15714 // Pass out-of-range patchControlPoints
15715 tsci_bad = tsci;
15716 tsci_bad.patchControlPoints = 0;
15717 pipe.SetTessellation(&tsci);
15718 pipe.SetTessellation(&tsci_bad);
15719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15720 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15721 m_errorMonitor->VerifyFound();
15722 tsci_bad.patchControlPoints = m_device->props.limits.maxTessellationPatchSize + 1;
15723 pipe.SetTessellation(&tsci_bad);
15724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15725 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15726 m_errorMonitor->VerifyFound();
15727 pipe.SetTessellation(&tsci);
15728
15729 // Pass an invalid primitive topology
15730 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15731 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
15732 pipe.SetInputAssembly(&iasci_bad);
15733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02099);
15734 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15735 m_errorMonitor->VerifyFound();
15736 pipe.SetInputAssembly(&iasci);
15737 }
15738}
15739
Karl Schultz6addd812016-02-02 17:17:23 -070015740TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015741 TEST_DESCRIPTION(
15742 "Test that an error is produced for a vertex attribute setup where multiple "
15743 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15745 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015746
Tony Barbour1fa09702017-03-16 12:09:08 -060015747 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015748 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015749
15750 /* Two binding descriptions for binding 0 */
15751 VkVertexInputBindingDescription input_bindings[2];
15752 memset(input_bindings, 0, sizeof(input_bindings));
15753
15754 VkVertexInputAttributeDescription input_attrib;
15755 memset(&input_attrib, 0, sizeof(input_attrib));
15756 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15757
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015758 char const *vsSource =
15759 "#version 450\n"
15760 "\n"
15761 "layout(location=0) in float x;\n" /* attrib provided float */
15762 "out gl_PerVertex {\n"
15763 " vec4 gl_Position;\n"
15764 "};\n"
15765 "void main(){\n"
15766 " gl_Position = vec4(x);\n"
15767 "}\n";
15768 char const *fsSource =
15769 "#version 450\n"
15770 "\n"
15771 "layout(location=0) out vec4 color;\n"
15772 "void main(){\n"
15773 " color = vec4(1);\n"
15774 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015775
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015776 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15777 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015778
15779 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015780 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015781 pipe.AddShader(&vs);
15782 pipe.AddShader(&fs);
15783
15784 pipe.AddVertexInputBindings(input_bindings, 2);
15785 pipe.AddVertexInputAttribs(&input_attrib, 1);
15786
Chris Forbes280ba2c2015-06-12 11:16:41 +120015787 VkDescriptorSetObj descriptorSet(m_device);
15788 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015789 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015790
Tony Barbour5781e8f2015-08-04 16:23:11 -060015791 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015792
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015793 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015794}
Chris Forbes8f68b562015-05-25 11:13:32 +120015795
Karl Schultz6addd812016-02-02 17:17:23 -070015796TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015797 TEST_DESCRIPTION(
15798 "Test that an error is produced for a fragment shader which does not "
15799 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015801
Tony Barbour1fa09702017-03-16 12:09:08 -060015802 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015803
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015804 char const *vsSource =
15805 "#version 450\n"
15806 "\n"
15807 "out gl_PerVertex {\n"
15808 " vec4 gl_Position;\n"
15809 "};\n"
15810 "void main(){\n"
15811 " gl_Position = vec4(1);\n"
15812 "}\n";
15813 char const *fsSource =
15814 "#version 450\n"
15815 "\n"
15816 "void main(){\n"
15817 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015818
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015819 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15820 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015821
15822 VkPipelineObj pipe(m_device);
15823 pipe.AddShader(&vs);
15824 pipe.AddShader(&fs);
15825
Chia-I Wu08accc62015-07-07 11:50:03 +080015826 /* set up CB 0, not written */
15827 pipe.AddColorAttachment();
15828 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015829
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015830 VkDescriptorSetObj descriptorSet(m_device);
15831 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015832 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015833
Tony Barbour5781e8f2015-08-04 16:23:11 -060015834 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015835
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015836 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015837}
15838
Karl Schultz6addd812016-02-02 17:17:23 -070015839TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015840 TEST_DESCRIPTION(
15841 "Test that a warning is produced for a fragment shader which provides a spurious "
15842 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015844 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015845
Tony Barbour1fa09702017-03-16 12:09:08 -060015846 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015847
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015848 char const *vsSource =
15849 "#version 450\n"
15850 "\n"
15851 "out gl_PerVertex {\n"
15852 " vec4 gl_Position;\n"
15853 "};\n"
15854 "void main(){\n"
15855 " gl_Position = vec4(1);\n"
15856 "}\n";
15857 char const *fsSource =
15858 "#version 450\n"
15859 "\n"
15860 "layout(location=0) out vec4 x;\n"
15861 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15862 "void main(){\n"
15863 " x = vec4(1);\n"
15864 " y = vec4(1);\n"
15865 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015866
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015867 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15868 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015869
15870 VkPipelineObj pipe(m_device);
15871 pipe.AddShader(&vs);
15872 pipe.AddShader(&fs);
15873
Chia-I Wu08accc62015-07-07 11:50:03 +080015874 /* set up CB 0, not written */
15875 pipe.AddColorAttachment();
15876 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015877 /* FS writes CB 1, but we don't configure it */
15878
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015879 VkDescriptorSetObj descriptorSet(m_device);
15880 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015881 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015882
Tony Barbour5781e8f2015-08-04 16:23:11 -060015883 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015884
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015885 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015886}
15887
Karl Schultz6addd812016-02-02 17:17:23 -070015888TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015889 TEST_DESCRIPTION(
15890 "Test that an error is produced for a mismatch between the fundamental "
15891 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015893
Tony Barbour1fa09702017-03-16 12:09:08 -060015894 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015895
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015896 char const *vsSource =
15897 "#version 450\n"
15898 "\n"
15899 "out gl_PerVertex {\n"
15900 " vec4 gl_Position;\n"
15901 "};\n"
15902 "void main(){\n"
15903 " gl_Position = vec4(1);\n"
15904 "}\n";
15905 char const *fsSource =
15906 "#version 450\n"
15907 "\n"
15908 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15909 "void main(){\n"
15910 " x = ivec4(1);\n"
15911 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015912
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015913 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15914 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015915
15916 VkPipelineObj pipe(m_device);
15917 pipe.AddShader(&vs);
15918 pipe.AddShader(&fs);
15919
Chia-I Wu08accc62015-07-07 11:50:03 +080015920 /* set up CB 0; type is UNORM by default */
15921 pipe.AddColorAttachment();
15922 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015923
Chris Forbesa36d69e2015-05-25 11:13:44 +120015924 VkDescriptorSetObj descriptorSet(m_device);
15925 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015926 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015927
Tony Barbour5781e8f2015-08-04 16:23:11 -060015928 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015929
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015930 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015931}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015932
Karl Schultz6addd812016-02-02 17:17:23 -070015933TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015934 TEST_DESCRIPTION(
15935 "Test that an error is produced for a shader consuming a uniform "
15936 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015938
Tony Barbour1fa09702017-03-16 12:09:08 -060015939 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015940
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015941 char const *vsSource =
15942 "#version 450\n"
15943 "\n"
15944 "out gl_PerVertex {\n"
15945 " vec4 gl_Position;\n"
15946 "};\n"
15947 "void main(){\n"
15948 " gl_Position = vec4(1);\n"
15949 "}\n";
15950 char const *fsSource =
15951 "#version 450\n"
15952 "\n"
15953 "layout(location=0) out vec4 x;\n"
15954 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15955 "void main(){\n"
15956 " x = vec4(bar.y);\n"
15957 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015958
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015959 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15960 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015961
Chris Forbes556c76c2015-08-14 12:04:59 +120015962 VkPipelineObj pipe(m_device);
15963 pipe.AddShader(&vs);
15964 pipe.AddShader(&fs);
15965
15966 /* set up CB 0; type is UNORM by default */
15967 pipe.AddColorAttachment();
15968 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15969
15970 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015971 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015972
15973 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15974
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015975 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015976}
15977
Chris Forbes5c59e902016-02-26 16:56:09 +130015978TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015979 TEST_DESCRIPTION(
15980 "Test that an error is produced for a shader consuming push constants "
15981 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015983
Tony Barbour1fa09702017-03-16 12:09:08 -060015984 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015985
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015986 char const *vsSource =
15987 "#version 450\n"
15988 "\n"
15989 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15990 "out gl_PerVertex {\n"
15991 " vec4 gl_Position;\n"
15992 "};\n"
15993 "void main(){\n"
15994 " gl_Position = vec4(consts.x);\n"
15995 "}\n";
15996 char const *fsSource =
15997 "#version 450\n"
15998 "\n"
15999 "layout(location=0) out vec4 x;\n"
16000 "void main(){\n"
16001 " x = vec4(1);\n"
16002 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130016003
16004 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16005 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16006
16007 VkPipelineObj pipe(m_device);
16008 pipe.AddShader(&vs);
16009 pipe.AddShader(&fs);
16010
16011 /* set up CB 0; type is UNORM by default */
16012 pipe.AddColorAttachment();
16013 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16014
16015 VkDescriptorSetObj descriptorSet(m_device);
16016 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16017
16018 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16019
16020 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016021 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130016022}
16023
Chris Forbes3fb17902016-08-22 14:57:55 +120016024TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016025 TEST_DESCRIPTION(
16026 "Test that an error is produced for a shader consuming an input attachment "
16027 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120016028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16029 "consumes input attachment index 0 but not provided in subpass");
16030
Tony Barbour1fa09702017-03-16 12:09:08 -060016031 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120016032
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016033 char const *vsSource =
16034 "#version 450\n"
16035 "\n"
16036 "out gl_PerVertex {\n"
16037 " vec4 gl_Position;\n"
16038 "};\n"
16039 "void main(){\n"
16040 " gl_Position = vec4(1);\n"
16041 "}\n";
16042 char const *fsSource =
16043 "#version 450\n"
16044 "\n"
16045 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
16046 "layout(location=0) out vec4 color;\n"
16047 "void main() {\n"
16048 " color = subpassLoad(x);\n"
16049 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120016050
16051 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16052 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16053
16054 VkPipelineObj pipe(m_device);
16055 pipe.AddShader(&vs);
16056 pipe.AddShader(&fs);
16057 pipe.AddColorAttachment();
16058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16059
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016060 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16061 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120016062 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016063 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120016064 ASSERT_VK_SUCCESS(err);
16065
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016066 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120016067 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016068 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120016069 ASSERT_VK_SUCCESS(err);
16070
16071 // error here.
16072 pipe.CreateVKPipeline(pl, renderPass());
16073
16074 m_errorMonitor->VerifyFound();
16075
16076 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16077 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16078}
16079
Chris Forbes5a9a0472016-08-22 16:02:09 +120016080TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016081 TEST_DESCRIPTION(
16082 "Test that an error is produced for a shader consuming an input attachment "
16083 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120016084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16085 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
16086
Tony Barbour1fa09702017-03-16 12:09:08 -060016087 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120016088
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016089 char const *vsSource =
16090 "#version 450\n"
16091 "\n"
16092 "out gl_PerVertex {\n"
16093 " vec4 gl_Position;\n"
16094 "};\n"
16095 "void main(){\n"
16096 " gl_Position = vec4(1);\n"
16097 "}\n";
16098 char const *fsSource =
16099 "#version 450\n"
16100 "\n"
16101 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
16102 "layout(location=0) out vec4 color;\n"
16103 "void main() {\n"
16104 " color = subpassLoad(x);\n"
16105 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120016106
16107 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16108 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16109
16110 VkPipelineObj pipe(m_device);
16111 pipe.AddShader(&vs);
16112 pipe.AddShader(&fs);
16113 pipe.AddColorAttachment();
16114 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16115
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016116 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16117 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016118 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016119 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016120 ASSERT_VK_SUCCESS(err);
16121
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016122 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016123 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016124 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016125 ASSERT_VK_SUCCESS(err);
16126
16127 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016128 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16129 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16130 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
16131 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16132 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 +120016133 };
16134 VkAttachmentReference color = {
16135 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16136 };
16137 VkAttachmentReference input = {
16138 1, VK_IMAGE_LAYOUT_GENERAL,
16139 };
16140
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016141 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016142
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016143 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016144 VkRenderPass rp;
16145 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
16146 ASSERT_VK_SUCCESS(err);
16147
16148 // error here.
16149 pipe.CreateVKPipeline(pl, rp);
16150
16151 m_errorMonitor->VerifyFound();
16152
16153 vkDestroyRenderPass(m_device->device(), rp, nullptr);
16154 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16155 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16156}
16157
Chris Forbes541f7b02016-08-22 15:30:27 +120016158TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016159 TEST_DESCRIPTION(
16160 "Test that an error is produced for a shader consuming an input attachment "
16161 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120016162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070016163 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120016164
Tony Barbour1fa09702017-03-16 12:09:08 -060016165 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120016166
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016167 char const *vsSource =
16168 "#version 450\n"
16169 "\n"
16170 "out gl_PerVertex {\n"
16171 " vec4 gl_Position;\n"
16172 "};\n"
16173 "void main(){\n"
16174 " gl_Position = vec4(1);\n"
16175 "}\n";
16176 char const *fsSource =
16177 "#version 450\n"
16178 "\n"
16179 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
16180 "layout(location=0) out vec4 color;\n"
16181 "void main() {\n"
16182 " color = subpassLoad(xs[0]);\n"
16183 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120016184
16185 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16186 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16187
16188 VkPipelineObj pipe(m_device);
16189 pipe.AddShader(&vs);
16190 pipe.AddShader(&fs);
16191 pipe.AddColorAttachment();
16192 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16193
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016194 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16195 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120016196 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016197 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016198 ASSERT_VK_SUCCESS(err);
16199
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016200 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120016201 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016202 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016203 ASSERT_VK_SUCCESS(err);
16204
16205 // error here.
16206 pipe.CreateVKPipeline(pl, renderPass());
16207
16208 m_errorMonitor->VerifyFound();
16209
16210 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16211 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16212}
16213
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016214TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016215 TEST_DESCRIPTION(
16216 "Test that an error is produced for a compute pipeline consuming a "
16217 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016219
Tony Barbour1fa09702017-03-16 12:09:08 -060016220 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016221
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016222 char const *csSource =
16223 "#version 450\n"
16224 "\n"
16225 "layout(local_size_x=1) in;\n"
16226 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16227 "void main(){\n"
16228 " x = vec4(1);\n"
16229 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016230
16231 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16232
16233 VkDescriptorSetObj descriptorSet(m_device);
16234 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16235
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016236 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16237 nullptr,
16238 0,
16239 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16240 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16241 descriptorSet.GetPipelineLayout(),
16242 VK_NULL_HANDLE,
16243 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016244
16245 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016246 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016247
16248 m_errorMonitor->VerifyFound();
16249
16250 if (err == VK_SUCCESS) {
16251 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16252 }
16253}
16254
Chris Forbes22a9b092016-07-19 14:34:05 +120016255TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016256 TEST_DESCRIPTION(
16257 "Test that an error is produced for a pipeline consuming a "
16258 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16260 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120016261
Tony Barbour1fa09702017-03-16 12:09:08 -060016262 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120016263
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016264 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
16265 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120016266 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016267 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016268 ASSERT_VK_SUCCESS(err);
16269
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016270 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120016271 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016272 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016273 ASSERT_VK_SUCCESS(err);
16274
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016275 char const *csSource =
16276 "#version 450\n"
16277 "\n"
16278 "layout(local_size_x=1) in;\n"
16279 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16280 "void main() {\n"
16281 " x.x = 1.0f;\n"
16282 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120016283 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16284
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016285 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16286 nullptr,
16287 0,
16288 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16289 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16290 pl,
16291 VK_NULL_HANDLE,
16292 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120016293
16294 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016295 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120016296
16297 m_errorMonitor->VerifyFound();
16298
16299 if (err == VK_SUCCESS) {
16300 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16301 }
16302
16303 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16304 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16305}
16306
Chris Forbes50020592016-07-27 13:52:41 +120016307TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016308 TEST_DESCRIPTION(
16309 "Test that an error is produced when an image view type "
16310 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120016311
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016312 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 +120016313
Tony Barbour1fa09702017-03-16 12:09:08 -060016314 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120016315 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16316
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016317 char const *vsSource =
16318 "#version 450\n"
16319 "\n"
16320 "out gl_PerVertex { vec4 gl_Position; };\n"
16321 "void main() { gl_Position = vec4(0); }\n";
16322 char const *fsSource =
16323 "#version 450\n"
16324 "\n"
16325 "layout(set=0, binding=0) uniform sampler3D s;\n"
16326 "layout(location=0) out vec4 color;\n"
16327 "void main() {\n"
16328 " color = texture(s, vec3(0));\n"
16329 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120016330 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16331 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16332
16333 VkPipelineObj pipe(m_device);
16334 pipe.AddShader(&vs);
16335 pipe.AddShader(&fs);
16336 pipe.AddColorAttachment();
16337
16338 VkTextureObj texture(m_device, nullptr);
16339 VkSamplerObj sampler(m_device);
16340
16341 VkDescriptorSetObj descriptorSet(m_device);
16342 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16343 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16344
16345 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16346 ASSERT_VK_SUCCESS(err);
16347
Tony Barbour552f6c02016-12-21 14:34:07 -070016348 m_commandBuffer->BeginCommandBuffer();
16349 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120016350
16351 m_commandBuffer->BindPipeline(pipe);
16352 m_commandBuffer->BindDescriptorSet(descriptorSet);
16353
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016354 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120016355 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016356 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120016357 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16358
16359 // error produced here.
16360 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16361
16362 m_errorMonitor->VerifyFound();
16363
Tony Barbour552f6c02016-12-21 14:34:07 -070016364 m_commandBuffer->EndRenderPass();
16365 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120016366}
16367
Chris Forbes5533bfc2016-07-27 14:12:34 +120016368TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016369 TEST_DESCRIPTION(
16370 "Test that an error is produced when a multisampled images "
16371 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016372
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016374
Tony Barbour1fa09702017-03-16 12:09:08 -060016375 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120016376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16377
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016378 char const *vsSource =
16379 "#version 450\n"
16380 "\n"
16381 "out gl_PerVertex { vec4 gl_Position; };\n"
16382 "void main() { gl_Position = vec4(0); }\n";
16383 char const *fsSource =
16384 "#version 450\n"
16385 "\n"
16386 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
16387 "layout(location=0) out vec4 color;\n"
16388 "void main() {\n"
16389 " color = texelFetch(s, ivec2(0), 0);\n"
16390 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120016391 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16392 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16393
16394 VkPipelineObj pipe(m_device);
16395 pipe.AddShader(&vs);
16396 pipe.AddShader(&fs);
16397 pipe.AddColorAttachment();
16398
16399 VkTextureObj texture(m_device, nullptr);
16400 VkSamplerObj sampler(m_device);
16401
16402 VkDescriptorSetObj descriptorSet(m_device);
16403 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16404 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16405
16406 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16407 ASSERT_VK_SUCCESS(err);
16408
Tony Barbour552f6c02016-12-21 14:34:07 -070016409 m_commandBuffer->BeginCommandBuffer();
16410 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120016411
16412 m_commandBuffer->BindPipeline(pipe);
16413 m_commandBuffer->BindDescriptorSet(descriptorSet);
16414
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016415 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016416 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016417 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016418 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16419
16420 // error produced here.
16421 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16422
16423 m_errorMonitor->VerifyFound();
16424
Tony Barbour552f6c02016-12-21 14:34:07 -070016425 m_commandBuffer->EndRenderPass();
16426 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120016427}
16428
Mark Youngc48c4c12016-04-11 14:26:49 -060016429TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016430 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016431
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016432 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16433 {
16434 VkFormatProperties properties;
16435 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16436 if (properties.optimalTilingFeatures == 0) {
16437 printf(" Image format not supported; skipped.\n");
16438 return;
16439 }
16440 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016441
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016442 VkImageCreateInfo info = {};
16443 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16444 info.pNext = NULL;
16445 info.imageType = VK_IMAGE_TYPE_2D;
16446 info.format = format;
16447 info.extent.height = 32;
16448 info.extent.depth = 1;
16449 info.mipLevels = 1;
16450 info.arrayLayers = 1;
16451 info.samples = VK_SAMPLE_COUNT_1_BIT;
16452 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16453 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16454 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016455
16456 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016457 {
16458 VkImageFormatProperties properties;
16459 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
16460 info.tiling, info.usage, info.flags, &properties);
16461 ASSERT_VK_SUCCESS(result);
16462 info.extent.width = properties.maxExtent.width + 1;
16463 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016464
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016465 VkImage image;
16466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
16467 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016468 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016469}
16470
Mark Youngc48c4c12016-04-11 14:26:49 -060016471TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016472 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060016473
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016474 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16475 {
16476 VkFormatProperties properties;
16477 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16478 if (properties.optimalTilingFeatures == 0) {
16479 printf(" Image format not supported; skipped.\n");
16480 return;
16481 }
16482 }
Mark Youngc48c4c12016-04-11 14:26:49 -060016483
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016484 VkImageCreateInfo info = {};
16485 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16486 info.pNext = NULL;
16487 info.imageType = VK_IMAGE_TYPE_2D;
16488 info.format = format;
16489 info.extent.height = 32;
16490 info.extent.depth = 1;
16491 info.mipLevels = 1;
16492 info.arrayLayers = 1;
16493 info.samples = VK_SAMPLE_COUNT_1_BIT;
16494 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16495 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16496 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016497
16498 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016499 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016500
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016501 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060016502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016503 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
16504 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060016505 m_errorMonitor->VerifyFound();
16506}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070016507
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016508TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016509 TEST_DESCRIPTION(
16510 "Create a render pass with an attachment description "
16511 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016512
Tony Barbour1fa09702017-03-16 12:09:08 -060016513 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016514 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16515
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070016516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016517
16518 VkAttachmentReference color_attach = {};
16519 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
16520 color_attach.attachment = 0;
16521 VkSubpassDescription subpass = {};
16522 subpass.colorAttachmentCount = 1;
16523 subpass.pColorAttachments = &color_attach;
16524
16525 VkRenderPassCreateInfo rpci = {};
16526 rpci.subpassCount = 1;
16527 rpci.pSubpasses = &subpass;
16528 rpci.attachmentCount = 1;
16529 VkAttachmentDescription attach_desc = {};
16530 attach_desc.format = VK_FORMAT_UNDEFINED;
16531 rpci.pAttachments = &attach_desc;
16532 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
16533 VkRenderPass rp;
16534 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
16535
16536 m_errorMonitor->VerifyFound();
16537
16538 if (result == VK_SUCCESS) {
16539 vkDestroyRenderPass(m_device->device(), rp, NULL);
16540 }
16541}
16542
Karl Schultz6addd812016-02-02 17:17:23 -070016543TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016544 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060016545
Mike Stroyana3082432015-09-25 13:39:21 -060016546 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070016547 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16548 const int32_t tex_width = 32;
16549 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060016550
16551 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016552 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16553 image_create_info.pNext = NULL;
16554 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16555 image_create_info.format = tex_format;
16556 image_create_info.extent.width = tex_width;
16557 image_create_info.extent.height = tex_height;
16558 image_create_info.extent.depth = 1;
16559 image_create_info.mipLevels = 1;
16560 image_create_info.arrayLayers = 1;
16561 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16562 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16563 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16564 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060016565
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016566 VkImage image;
16567 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060016568 ASSERT_VK_SUCCESS(err);
16569
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016570 VkMemoryRequirements requirements;
16571 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
16572
16573 VkMemoryAllocateInfo alloc_info{};
16574 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16575 alloc_info.pNext = NULL;
16576 alloc_info.memoryTypeIndex = 0;
16577 alloc_info.allocationSize = requirements.size;
16578 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16579 ASSERT_TRUE(pass);
16580
16581 VkDeviceMemory memory;
16582 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16583 ASSERT_VK_SUCCESS(err);
16584
16585 err = vkBindImageMemory(m_device->device(), image, memory, 0);
16586
Tobin Ehliscde08892015-09-22 10:11:37 -060016587 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016588 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070016589 image_view_create_info.image = image;
16590 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16591 image_view_create_info.format = tex_format;
16592 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016593 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070016594 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016595 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060016596
16597 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016599 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016600 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016601
16602 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060016603 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060016604}
Mike Stroyana3082432015-09-25 13:39:21 -060016605
Mark Youngd339ba32016-05-30 13:28:35 -060016606TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
16607 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060016608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060016609 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060016610
Tony Barbour1fa09702017-03-16 12:09:08 -060016611 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060016612
16613 // Create an image and try to create a view with no memory backing the image
16614 VkImage image;
16615
16616 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16617 const int32_t tex_width = 32;
16618 const int32_t tex_height = 32;
16619
16620 VkImageCreateInfo image_create_info = {};
16621 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16622 image_create_info.pNext = NULL;
16623 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16624 image_create_info.format = tex_format;
16625 image_create_info.extent.width = tex_width;
16626 image_create_info.extent.height = tex_height;
16627 image_create_info.extent.depth = 1;
16628 image_create_info.mipLevels = 1;
16629 image_create_info.arrayLayers = 1;
16630 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16631 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16632 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16633 image_create_info.flags = 0;
16634
16635 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16636 ASSERT_VK_SUCCESS(err);
16637
16638 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016639 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060016640 image_view_create_info.image = image;
16641 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16642 image_view_create_info.format = tex_format;
16643 image_view_create_info.subresourceRange.layerCount = 1;
16644 image_view_create_info.subresourceRange.baseMipLevel = 0;
16645 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016646 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060016647
16648 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016649 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060016650
16651 m_errorMonitor->VerifyFound();
16652 vkDestroyImage(m_device->device(), image, NULL);
16653 // If last error is success, it still created the view, so delete it.
16654 if (err == VK_SUCCESS) {
16655 vkDestroyImageView(m_device->device(), view, NULL);
16656 }
Mark Youngd339ba32016-05-30 13:28:35 -060016657}
16658
Karl Schultz6addd812016-02-02 17:17:23 -070016659TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016660 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016662
Tony Barbour1fa09702017-03-16 12:09:08 -060016663 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016664
Karl Schultz6addd812016-02-02 17:17:23 -070016665 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016666 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016667 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016668 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016669
16670 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016671 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016672 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070016673 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16674 image_view_create_info.format = tex_format;
16675 image_view_create_info.subresourceRange.baseMipLevel = 0;
16676 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016677 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016678 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016679 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016680
16681 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016682 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016683
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016684 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016685}
16686
Mike Weiblena1e13f42017-02-09 21:25:59 -070016687TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
16688 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
16689
Tony Barbour1fa09702017-03-16 12:09:08 -060016690 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070016691 VkSubresourceLayout subres_layout = {};
16692
16693 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
16694 {
16695 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
16696 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016697 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016698 ASSERT_TRUE(img.initialized());
16699
16700 VkImageSubresource subres = {};
16701 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16702 subres.mipLevel = 0;
16703 subres.arrayLayer = 0;
16704
16705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
16706 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16707 m_errorMonitor->VerifyFound();
16708 }
16709
16710 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
16711 {
16712 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016713 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016714 ASSERT_TRUE(img.initialized());
16715
16716 VkImageSubresource subres = {};
16717 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
16718 subres.mipLevel = 0;
16719 subres.arrayLayer = 0;
16720
16721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16722 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16723 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16724 m_errorMonitor->VerifyFound();
16725 }
16726
16727 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16728 {
16729 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016730 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016731 ASSERT_TRUE(img.initialized());
16732
16733 VkImageSubresource subres = {};
16734 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16735 subres.mipLevel = 1; // ERROR: triggers VU 00739
16736 subres.arrayLayer = 0;
16737
16738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16739 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16740 m_errorMonitor->VerifyFound();
16741 }
16742
16743 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16744 {
16745 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016746 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016747 ASSERT_TRUE(img.initialized());
16748
16749 VkImageSubresource subres = {};
16750 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16751 subres.mipLevel = 0;
16752 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16753
16754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16755 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16756 m_errorMonitor->VerifyFound();
16757 }
16758}
16759
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016760TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016761 VkResult err;
16762 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016763
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016765
Tony Barbour1fa09702017-03-16 12:09:08 -060016766 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016767
16768 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016769 VkImage srcImage;
16770 VkImage dstImage;
16771 VkDeviceMemory srcMem;
16772 VkDeviceMemory destMem;
16773 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016774
16775 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016776 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16777 image_create_info.pNext = NULL;
16778 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16779 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16780 image_create_info.extent.width = 32;
16781 image_create_info.extent.height = 32;
16782 image_create_info.extent.depth = 1;
16783 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016784 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016785 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16786 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16787 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16788 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016789
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016790 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016791 ASSERT_VK_SUCCESS(err);
16792
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016793 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016794 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016795 ASSERT_VK_SUCCESS(err);
16796
16797 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016798 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016799 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16800 memAlloc.pNext = NULL;
16801 memAlloc.allocationSize = 0;
16802 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016803
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016804 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016805 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016806 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016807 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016808 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016809 ASSERT_VK_SUCCESS(err);
16810
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016811 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016812 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016813 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016814 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016815 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016816 ASSERT_VK_SUCCESS(err);
16817
16818 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16819 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016820 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016821 ASSERT_VK_SUCCESS(err);
16822
Tony Barbour552f6c02016-12-21 14:34:07 -070016823 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016824 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016825 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016826 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016827 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016828 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016829 copyRegion.srcOffset.x = 0;
16830 copyRegion.srcOffset.y = 0;
16831 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016832 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016833 copyRegion.dstSubresource.mipLevel = 0;
16834 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016835 // Introduce failure by forcing the dst layerCount to differ from src
16836 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016837 copyRegion.dstOffset.x = 0;
16838 copyRegion.dstOffset.y = 0;
16839 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016840 copyRegion.extent.width = 1;
16841 copyRegion.extent.height = 1;
16842 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016843 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016844 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016845
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016846 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016847
Chia-I Wuf7458c52015-10-26 21:10:41 +080016848 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016849 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016850 vkFreeMemory(m_device->device(), srcMem, NULL);
16851 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016852}
16853
Tony Barbourd6673642016-05-05 14:46:39 -060016854TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016855 TEST_DESCRIPTION("Creating images with unsuported formats ");
16856
Tony Barbour1fa09702017-03-16 12:09:08 -060016857 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016858 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016859
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016860 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016861 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016862 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016863 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16864 image_create_info.format = VK_FORMAT_UNDEFINED;
16865 image_create_info.extent.width = 32;
16866 image_create_info.extent.height = 32;
16867 image_create_info.extent.depth = 1;
16868 image_create_info.mipLevels = 1;
16869 image_create_info.arrayLayers = 1;
16870 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16871 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16872 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016873
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16875 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016876
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016877 VkImage image;
16878 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016879 m_errorMonitor->VerifyFound();
16880
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016881 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016882 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016883 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16884 VkFormat format = static_cast<VkFormat>(f);
16885 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016886 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016887 unsupported = format;
16888 break;
16889 }
16890 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016891
Tony Barbourd6673642016-05-05 14:46:39 -060016892 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016893 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016895
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016896 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016897 m_errorMonitor->VerifyFound();
16898 }
16899}
16900
16901TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016902 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16903
Tony Barbour1fa09702017-03-16 12:09:08 -060016904 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016905 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016906 if (!depth_format) {
16907 return;
16908 }
Tony Barbourd6673642016-05-05 14:46:39 -060016909
16910 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016911 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 -060016912 VK_IMAGE_TILING_OPTIMAL, 0);
16913 ASSERT_TRUE(image.initialized());
16914
16915 VkImageView imgView;
16916 VkImageViewCreateInfo imgViewInfo = {};
16917 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16918 imgViewInfo.image = image.handle();
16919 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16920 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16921 imgViewInfo.subresourceRange.layerCount = 1;
16922 imgViewInfo.subresourceRange.baseMipLevel = 0;
16923 imgViewInfo.subresourceRange.levelCount = 1;
16924 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16925
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016926 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016927 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016929 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16930 m_errorMonitor->VerifyFound();
16931 imgViewInfo.subresourceRange.baseMipLevel = 0;
16932
Tony Barbourd6673642016-05-05 14:46:39 -060016933 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16934 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016936 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16937 m_errorMonitor->VerifyFound();
16938 imgViewInfo.subresourceRange.levelCount = 1;
16939
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016940 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16941 imgViewInfo.subresourceRange.levelCount = 2;
16942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16943 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16944 m_errorMonitor->VerifyFound();
16945 imgViewInfo.subresourceRange.levelCount = 1;
16946
16947 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16948 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16950 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16951 m_errorMonitor->VerifyFound();
16952 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16953
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016954 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16955 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016956 m_errorMonitor->SetDesiredFailureMsg(
16957 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16958 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016959 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16960 m_errorMonitor->VerifyFound();
16961 imgViewInfo.subresourceRange.layerCount = 1;
16962
Tony Barbourd6673642016-05-05 14:46:39 -060016963 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016964 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016965 m_errorMonitor->SetDesiredFailureMsg(
16966 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16967 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016968 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16969 m_errorMonitor->VerifyFound();
16970 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16971
Tony Barbourd6673642016-05-05 14:46:39 -060016972 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16973 // VIEW_CREATE_ERROR
16974 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016976 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16977 m_errorMonitor->VerifyFound();
16978 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16979
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016980 // TODO: Update framework to easily passing mutable flag into ImageObj init
16981 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016982 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16983 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16984 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016985 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16986 // VIEW_CREATE_ERROR
16987 VkImageCreateInfo mutImgInfo = image.create_info();
16988 VkImage mutImage;
16989 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016990 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016991 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16992 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016993 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016994 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016995
16996 VkMemoryRequirements requirements;
16997 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16998
16999 VkMemoryAllocateInfo alloc_info{};
17000 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17001 alloc_info.pNext = NULL;
17002 alloc_info.memoryTypeIndex = 0;
17003 alloc_info.allocationSize = requirements.size;
17004 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
17005 ASSERT_TRUE(pass);
17006
17007 VkDeviceMemory memory;
17008 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
17009 ASSERT_VK_SUCCESS(ret);
17010
17011 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
17012 ASSERT_VK_SUCCESS(ret);
17013
Tony Barbourd6673642016-05-05 14:46:39 -060017014 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060017015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060017016 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17017 m_errorMonitor->VerifyFound();
17018 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060017019
17020 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060017021 vkDestroyImage(m_device->handle(), mutImage, NULL);
17022}
17023
Dave Houlton75967fc2017-03-06 17:21:16 -070017024TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
17025 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
17026
Tony Barbour1fa09702017-03-16 12:09:08 -060017027 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070017028
Jamie Madill35127872017-03-15 16:17:46 -040017029 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070017030 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
17031 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
17032 if (device_features.textureCompressionBC) {
17033 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
17034 } else if (device_features.textureCompressionETC2) {
17035 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
17036 } else if (device_features.textureCompressionASTC_LDR) {
17037 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
17038 } else {
17039 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
17040 return;
17041 }
17042
17043 VkImageCreateInfo ci;
17044 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17045 ci.pNext = NULL;
17046 ci.flags = 0;
17047 ci.imageType = VK_IMAGE_TYPE_2D;
17048 ci.format = compressed_format;
17049 ci.extent = {32, 32, 1};
17050 ci.mipLevels = 6;
17051 ci.arrayLayers = 1;
17052 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17053 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17054 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17055 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17056 ci.queueFamilyIndexCount = 0;
17057 ci.pQueueFamilyIndices = NULL;
17058 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17059
17060 VkImageObj image(m_device);
17061 image.init(&ci);
17062 ASSERT_TRUE(image.initialized());
17063
17064 VkImageObj odd_image(m_device);
17065 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
17066 odd_image.init(&ci);
17067 ASSERT_TRUE(odd_image.initialized());
17068
17069 // Allocate buffers
17070 VkMemoryPropertyFlags reqs = 0;
17071 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
17072 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
17073 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
17074 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
17075 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
17076
17077 VkBufferImageCopy region = {};
17078 region.bufferRowLength = 0;
17079 region.bufferImageHeight = 0;
17080 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17081 region.imageSubresource.layerCount = 1;
17082 region.imageOffset = {0, 0, 0};
17083 region.bufferOffset = 0;
17084
17085 // start recording
17086 m_commandBuffer->BeginCommandBuffer();
17087
17088 // Mip level copies that work - 5 levels
17089 m_errorMonitor->ExpectSuccess();
17090
17091 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
17092 region.imageExtent = {32, 32, 1};
17093 region.imageSubresource.mipLevel = 0;
17094 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
17095 &region);
17096 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17097 &region);
17098
17099 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
17100 region.imageExtent = {8, 8, 1};
17101 region.imageSubresource.mipLevel = 2;
17102 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
17103 &region);
17104 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17105 &region);
17106
17107 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
17108 region.imageExtent = {4, 4, 1};
17109 region.imageSubresource.mipLevel = 3;
17110 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17111 &region);
17112 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17113 &region);
17114
17115 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
17116 region.imageExtent = {2, 2, 1};
17117 region.imageSubresource.mipLevel = 4;
17118 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17119 &region);
17120 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17121 &region);
17122
17123 region.imageExtent = {1, 1, 1};
17124 region.imageSubresource.mipLevel = 5;
17125 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17126 &region);
17127 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17128 &region);
17129 m_errorMonitor->VerifyNotFound();
17130
17131 // Buffer must accomodate a full compressed block, regardless of texel count
17132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17133 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
17134 &region);
17135 m_errorMonitor->VerifyFound();
17136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
17137 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17138 &region);
17139 m_errorMonitor->VerifyFound();
17140
17141 // Copy width < compressed block size, but not the full mip width
17142 region.imageExtent = {1, 2, 1};
17143 region.imageSubresource.mipLevel = 4;
17144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17145 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17146 &region);
17147 m_errorMonitor->VerifyFound();
17148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17149 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17150 &region);
17151 m_errorMonitor->VerifyFound();
17152
17153 // Copy height < compressed block size but not the full mip height
17154 region.imageExtent = {2, 1, 1};
17155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17156 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17157 &region);
17158 m_errorMonitor->VerifyFound();
17159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17160 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17161 &region);
17162 m_errorMonitor->VerifyFound();
17163
17164 // Offsets must be multiple of compressed block size
17165 region.imageOffset = {1, 1, 0};
17166 region.imageExtent = {1, 1, 1};
17167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17168 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17169 &region);
17170 m_errorMonitor->VerifyFound();
17171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17172 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17173 &region);
17174 m_errorMonitor->VerifyFound();
17175
17176 // Offset + extent width = mip width - should succeed
17177 region.imageOffset = {4, 4, 0};
17178 region.imageExtent = {3, 4, 1};
17179 region.imageSubresource.mipLevel = 2;
17180 m_errorMonitor->ExpectSuccess();
17181 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17182 &region);
17183 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17184 &region);
17185 m_errorMonitor->VerifyNotFound();
17186
17187 // Offset + extent width > mip width, but still within the final compressed block - should succeed
17188 region.imageExtent = {4, 4, 1};
17189 m_errorMonitor->ExpectSuccess();
17190 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17191 &region);
17192 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17193 &region);
17194 m_errorMonitor->VerifyNotFound();
17195
17196 // Offset + extent width < mip width and not a multiple of block width - should fail
17197 region.imageExtent = {3, 3, 1};
17198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17199 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17200 &region);
17201 m_errorMonitor->VerifyFound();
17202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17203 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17204 &region);
17205 m_errorMonitor->VerifyFound();
17206}
17207
Dave Houlton59a20702017-02-02 17:26:23 -070017208TEST_F(VkLayerTest, ImageBufferCopyTests) {
17209 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
17210
Tony Barbour1fa09702017-03-16 12:09:08 -060017211 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017212 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
17213 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
17214 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
17215 return;
17216 }
Dave Houlton584d51e2017-02-16 12:52:54 -070017217
17218 // Bail if any dimension of transfer granularity is 0.
17219 auto index = m_device->graphics_queue_node_index_;
17220 auto queue_family_properties = m_device->phy().queue_properties();
17221 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
17222 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
17223 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
17224 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
17225 return;
17226 }
17227
Dave Houlton59a20702017-02-02 17:26:23 -070017228 VkImageObj image_64k(m_device); // 128^2 texels, 64k
17229 VkImageObj image_16k(m_device); // 64^2 texels, 16k
17230 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070017231 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
17232 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
17233 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
17234 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
17235
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017236 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017237 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17238 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017239 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017240 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17241 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017242 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 -070017243 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070017244 ASSERT_TRUE(image_64k.initialized());
17245 ASSERT_TRUE(image_16k.initialized());
17246 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017247
Dave Houltonf3229d52017-02-21 15:59:08 -070017248 // Verify all needed Depth/Stencil formats are supported
17249 bool missing_ds_support = false;
17250 VkFormatProperties props = {0, 0, 0};
17251 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
17252 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17253 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
17254 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17255 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
17256 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17257 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
17258 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17259
17260 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017261 ds_image_4D_1S.Init(
17262 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017263 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17264 VK_IMAGE_TILING_OPTIMAL, 0);
17265 ASSERT_TRUE(ds_image_4D_1S.initialized());
17266
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017267 ds_image_3D_1S.Init(
17268 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017269 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17270 VK_IMAGE_TILING_OPTIMAL, 0);
17271 ASSERT_TRUE(ds_image_3D_1S.initialized());
17272
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017273 ds_image_2D.Init(
17274 256, 256, 1, VK_FORMAT_D16_UNORM,
17275 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17276 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017277 ASSERT_TRUE(ds_image_2D.initialized());
17278
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017279 ds_image_1S.Init(
17280 256, 256, 1, VK_FORMAT_S8_UINT,
17281 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17282 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017283 ASSERT_TRUE(ds_image_1S.initialized());
17284 }
17285
17286 // Allocate buffers
17287 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070017288 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070017289 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
17290 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
17291 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
17292 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070017293
17294 VkBufferImageCopy region = {};
17295 region.bufferRowLength = 0;
17296 region.bufferImageHeight = 0;
17297 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17298 region.imageSubresource.layerCount = 1;
17299 region.imageOffset = {0, 0, 0};
17300 region.imageExtent = {64, 64, 1};
17301 region.bufferOffset = 0;
17302
17303 // attempt copies before putting command buffer in recording state
17304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
17305 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17306 &region);
17307 m_errorMonitor->VerifyFound();
17308
17309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
17310 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17311 &region);
17312 m_errorMonitor->VerifyFound();
17313
17314 // start recording
17315 m_commandBuffer->BeginCommandBuffer();
17316
17317 // successful copies
17318 m_errorMonitor->ExpectSuccess();
17319 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17320 &region);
17321 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17322 &region);
17323 region.imageOffset.x = 16; // 16k copy, offset requires larger image
17324 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17325 &region);
17326 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
17327 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17328 &region);
17329 region.imageOffset.x = 0;
17330 region.imageExtent.height = 64;
17331 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
17332 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17333 &region);
17334 m_errorMonitor->VerifyNotFound();
17335
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017336 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070017337 region.imageExtent = {65, 64, 1};
17338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17339 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17340 &region);
17341 m_errorMonitor->VerifyFound();
17342
17343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17344 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17345 &region);
17346 m_errorMonitor->VerifyFound();
17347
17348 // image/buffer too small (offset) on copy to image
17349 region.imageExtent = {64, 64, 1};
17350 region.imageOffset = {0, 4, 0};
17351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17352 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17353 &region);
17354 m_errorMonitor->VerifyFound();
17355
17356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17357 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17358 &region);
17359 m_errorMonitor->VerifyFound();
17360
17361 // image/buffer too small on copy to buffer
17362 region.imageExtent = {64, 64, 1};
17363 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070017364 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
17366 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17367 &region);
17368 m_errorMonitor->VerifyFound();
17369
17370 region.imageExtent = {64, 65, 1};
17371 region.bufferOffset = 0;
17372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
17373 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17374 &region);
17375 m_errorMonitor->VerifyFound();
17376
17377 // buffer size ok but rowlength causes loose packing
17378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17379 region.imageExtent = {64, 64, 1};
17380 region.bufferRowLength = 68;
17381 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17382 &region);
17383 m_errorMonitor->VerifyFound();
17384
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017385 // An extent with zero area should produce a warning, but no error
17386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
17387 region.imageExtent.width = 0;
17388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17389 &region);
17390 m_errorMonitor->VerifyFound();
17391
Dave Houlton59a20702017-02-02 17:26:23 -070017392 // aspect bits
17393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
17394 region.imageExtent = {64, 64, 1};
17395 region.bufferRowLength = 0;
17396 region.bufferImageHeight = 0;
17397 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17398 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17399 buffer_16k.handle(), 1, &region);
17400 m_errorMonitor->VerifyFound();
17401
17402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
17403 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17404 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17405 &region);
17406 m_errorMonitor->VerifyFound();
17407
17408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
17409 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17410 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17411 buffer_16k.handle(), 1, &region);
17412 m_errorMonitor->VerifyFound();
17413
Dave Houltonf3229d52017-02-21 15:59:08 -070017414 // Test Depth/Stencil copies
17415 if (missing_ds_support) {
17416 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
17417 } else {
17418 VkBufferImageCopy ds_region = {};
17419 ds_region.bufferOffset = 0;
17420 ds_region.bufferRowLength = 0;
17421 ds_region.bufferImageHeight = 0;
17422 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17423 ds_region.imageSubresource.mipLevel = 0;
17424 ds_region.imageSubresource.baseArrayLayer = 0;
17425 ds_region.imageSubresource.layerCount = 1;
17426 ds_region.imageOffset = {0, 0, 0};
17427 ds_region.imageExtent = {256, 256, 1};
17428
17429 // Depth copies that should succeed
17430 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
17431 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17432 buffer_256k.handle(), 1, &ds_region);
17433 m_errorMonitor->VerifyNotFound();
17434
17435 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
17436 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17437 buffer_256k.handle(), 1, &ds_region);
17438 m_errorMonitor->VerifyNotFound();
17439
17440 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
17441 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17442 buffer_128k.handle(), 1, &ds_region);
17443 m_errorMonitor->VerifyNotFound();
17444
17445 // Depth copies that should fail
17446 ds_region.bufferOffset = 4;
17447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17448 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
17449 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17450 buffer_256k.handle(), 1, &ds_region);
17451 m_errorMonitor->VerifyFound();
17452
17453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17454 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
17455 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17456 buffer_256k.handle(), 1, &ds_region);
17457 m_errorMonitor->VerifyFound();
17458
17459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17460 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
17461 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17462 buffer_128k.handle(), 1, &ds_region);
17463 m_errorMonitor->VerifyFound();
17464
17465 // Stencil copies that should succeed
17466 ds_region.bufferOffset = 0;
17467 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17468 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17469 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17470 buffer_64k.handle(), 1, &ds_region);
17471 m_errorMonitor->VerifyNotFound();
17472
17473 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17474 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17475 buffer_64k.handle(), 1, &ds_region);
17476 m_errorMonitor->VerifyNotFound();
17477
17478 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
17479 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17480 buffer_64k.handle(), 1, &ds_region);
17481 m_errorMonitor->VerifyNotFound();
17482
17483 // Stencil copies that should fail
17484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17485 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17486 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17487 buffer_16k.handle(), 1, &ds_region);
17488 m_errorMonitor->VerifyFound();
17489
17490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17491 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17492 ds_region.bufferRowLength = 260;
17493 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17494 buffer_64k.handle(), 1, &ds_region);
17495 m_errorMonitor->VerifyFound();
17496
17497 ds_region.bufferRowLength = 0;
17498 ds_region.bufferOffset = 4;
17499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17500 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
17501 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17502 buffer_64k.handle(), 1, &ds_region);
17503 m_errorMonitor->VerifyFound();
17504 }
17505
Dave Houlton584d51e2017-02-16 12:52:54 -070017506 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040017507 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070017508 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070017509 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
17510 device_features.textureCompressionASTC_LDR)) {
17511 printf(" No compressed formats supported - block compression tests skipped.\n");
17512 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070017513 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
17514 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070017515 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017516 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
17517 0);
17518 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 -070017519 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017520 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017521 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 -070017522 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017523 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 -070017524 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017525 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017526 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 -070017527 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017528 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 -070017529 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017530 }
17531 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017532
Dave Houlton584d51e2017-02-16 12:52:54 -070017533 // Just fits
17534 m_errorMonitor->ExpectSuccess();
17535 region.imageExtent = {128, 128, 1};
17536 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17537 buffer_16k.handle(), 1, &region);
17538 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017539
Dave Houlton584d51e2017-02-16 12:52:54 -070017540 // with offset, too big for buffer
17541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17542 region.bufferOffset = 16;
17543 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17544 buffer_16k.handle(), 1, &region);
17545 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017546 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017547
Dave Houlton67e9b532017-03-02 17:00:10 -070017548 // extents that are not a multiple of compressed block size
17549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17550 region.imageExtent.width = 66;
17551 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17552 buffer_16k.handle(), 1, &region);
17553 m_errorMonitor->VerifyFound();
17554 region.imageExtent.width = 128;
17555
17556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017557 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070017558 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17559 buffer_16k.handle(), 1, &region);
17560 m_errorMonitor->VerifyFound();
17561 region.imageExtent.height = 128;
17562
17563 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
17564
17565 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
17566 m_errorMonitor->ExpectSuccess();
17567 region.imageExtent.width = 66;
17568 region.imageOffset.x = 64;
17569 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17570 buffer_16k.handle(), 1, &region);
17571 region.imageExtent.width = 16;
17572 region.imageOffset.x = 0;
17573 region.imageExtent.height = 2;
17574 region.imageOffset.y = 128;
17575 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017576 buffer_16k.handle(), 1, &region);
17577 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017578 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017579
Dave Houlton584d51e2017-02-16 12:52:54 -070017580 // buffer offset must be a multiple of texel block size (16)
17581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
17582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
17583 region.imageExtent = {64, 64, 1};
17584 region.bufferOffset = 24;
17585 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17586 buffer_16k.handle(), 1, &region);
17587 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017588
Dave Houlton584d51e2017-02-16 12:52:54 -070017589 // rowlength not a multiple of block width (4)
17590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
17591 region.bufferOffset = 0;
17592 region.bufferRowLength = 130;
17593 region.bufferImageHeight = 0;
17594 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17595 buffer_64k.handle(), 1, &region);
17596 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017597
Dave Houlton584d51e2017-02-16 12:52:54 -070017598 // imageheight not a multiple of block height (4)
17599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
17600 region.bufferRowLength = 0;
17601 region.bufferImageHeight = 130;
17602 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17603 buffer_64k.handle(), 1, &region);
17604 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070017605 }
Dave Houlton59a20702017-02-02 17:26:23 -070017606}
17607
Tony Barbourd6673642016-05-05 14:46:39 -060017608TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070017609 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060017610
Tony Barbour1fa09702017-03-16 12:09:08 -060017611 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060017612
Rene Lindsay135204f2016-12-22 17:11:09 -070017613 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060017614 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017615 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 -070017616 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060017617 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060017618 vk_testing::Buffer buffer;
17619 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070017620 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060017621 VkBufferImageCopy region = {};
17622 region.bufferRowLength = 128;
17623 region.bufferImageHeight = 128;
17624 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17625 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070017626 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017627 region.imageExtent.height = 4;
17628 region.imageExtent.width = 4;
17629 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070017630
17631 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017632 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 -070017633 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070017634 ASSERT_TRUE(image2.initialized());
17635 vk_testing::Buffer buffer2;
17636 VkMemoryPropertyFlags reqs2 = 0;
17637 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
17638 VkBufferImageCopy region2 = {};
17639 region2.bufferRowLength = 128;
17640 region2.bufferImageHeight = 128;
17641 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17642 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
17643 region2.imageSubresource.layerCount = 1;
17644 region2.imageExtent.height = 4;
17645 region2.imageExtent.width = 4;
17646 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017647 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060017648
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017649 // Image must have offset.z of 0 and extent.depth of 1
17650 // Introduce failure by setting imageExtent.depth to 0
17651 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017653 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017654 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017655 m_errorMonitor->VerifyFound();
17656
17657 region.imageExtent.depth = 1;
17658
17659 // Image must have offset.z of 0 and extent.depth of 1
17660 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017661 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017662 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017665 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017666 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017667 m_errorMonitor->VerifyFound();
17668
17669 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017670 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
17671 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070017672 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017674 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17675 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017676 m_errorMonitor->VerifyFound();
17677
17678 // BufferOffset must be a multiple of 4
17679 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070017680 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070017682 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
17683 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017684 m_errorMonitor->VerifyFound();
17685
17686 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
17687 region.bufferOffset = 0;
17688 region.imageExtent.height = 128;
17689 region.imageExtent.width = 128;
17690 // Introduce failure by setting bufferRowLength > 0 but less than width
17691 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017693 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17694 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017695 m_errorMonitor->VerifyFound();
17696
17697 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
17698 region.bufferRowLength = 128;
17699 // Introduce failure by setting bufferRowHeight > 0 but less than height
17700 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017702 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17703 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017704 m_errorMonitor->VerifyFound();
17705
17706 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060017707 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017708 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 -070017709 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017710 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017711 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 -070017712 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017713 VkImageBlit blitRegion = {};
17714 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17715 blitRegion.srcSubresource.baseArrayLayer = 0;
17716 blitRegion.srcSubresource.layerCount = 1;
17717 blitRegion.srcSubresource.mipLevel = 0;
17718 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17719 blitRegion.dstSubresource.baseArrayLayer = 0;
17720 blitRegion.dstSubresource.layerCount = 1;
17721 blitRegion.dstSubresource.mipLevel = 0;
17722
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017723 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17725 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17727 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017728 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17729 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017730 m_errorMonitor->VerifyFound();
17731
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017733 VkImageMemoryBarrier img_barrier;
17734 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17735 img_barrier.pNext = NULL;
17736 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17737 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17738 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17739 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17740 img_barrier.image = image.handle();
17741 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17742 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17743 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17744 img_barrier.subresourceRange.baseArrayLayer = 0;
17745 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017746 img_barrier.subresourceRange.layerCount = 0;
17747 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017748 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17749 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017750 m_errorMonitor->VerifyFound();
17751 img_barrier.subresourceRange.layerCount = 1;
17752}
17753
17754TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017755 TEST_DESCRIPTION("Exceed the limits of image format ");
17756
Tony Barbour1fa09702017-03-16 12:09:08 -060017757 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017758
17759 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17760 {
17761 VkFormatProperties properties;
17762 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17763 if (properties.linearTilingFeatures == 0) {
17764 printf(" Image format not supported; skipped.\n");
17765 return;
17766 }
17767 }
17768
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017770 VkImageCreateInfo image_create_info = {};
17771 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17772 image_create_info.pNext = NULL;
17773 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017774 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017775 image_create_info.extent.width = 32;
17776 image_create_info.extent.height = 32;
17777 image_create_info.extent.depth = 1;
17778 image_create_info.mipLevels = 1;
17779 image_create_info.arrayLayers = 1;
17780 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17781 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17782 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17783 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17784 image_create_info.flags = 0;
17785
17786 VkImage nullImg;
17787 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017788 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17789 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017790 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017791 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17792 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17793 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017794 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017795
Tony Barbour0907e362017-03-09 15:05:30 -070017796 uint32_t maxDim =
17797 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17798 // If max mip levels exceeds image extents, skip the max mip levels test
17799 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17801 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17802 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17803 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17804 m_errorMonitor->VerifyFound();
17805 image_create_info.mipLevels = 1;
17806 }
Tony Barbourd6673642016-05-05 14:46:39 -060017807
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017809 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17810 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17811 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17812 m_errorMonitor->VerifyFound();
17813 image_create_info.arrayLayers = 1;
17814
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017816 int samples = imgFmtProps.sampleCounts >> 1;
17817 image_create_info.samples = (VkSampleCountFlagBits)samples;
17818 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17819 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17820 m_errorMonitor->VerifyFound();
17821 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17822
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17824 "pCreateInfo->initialLayout, must be "
17825 "VK_IMAGE_LAYOUT_UNDEFINED or "
17826 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017827 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17828 // Expect INVALID_LAYOUT
17829 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17830 m_errorMonitor->VerifyFound();
17831 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17832}
17833
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017834TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017835 // Image copy with source region specified greater than src image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017836 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017837
Dave Houltonfc1a4052017-04-27 14:32:45 -060017838 // Create images with full mip chain
17839 VkImageCreateInfo ci;
17840 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17841 ci.pNext = NULL;
17842 ci.flags = 0;
17843 ci.imageType = VK_IMAGE_TYPE_3D;
17844 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17845 ci.extent = {32, 32, 8};
17846 ci.mipLevels = 6;
17847 ci.arrayLayers = 1;
17848 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17849 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17850 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17851 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17852 ci.queueFamilyIndexCount = 0;
17853 ci.pQueueFamilyIndices = NULL;
17854 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17855
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017856 VkImageObj src_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017857 src_image.init(&ci);
17858 ASSERT_TRUE(src_image.initialized());
17859
17860 // Dest image with one more mip level
17861 ci.extent = {64, 64, 16};
17862 ci.mipLevels = 7;
17863 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017864 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017865 dst_image.init(&ci);
17866 ASSERT_TRUE(dst_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017867
Tony Barbour552f6c02016-12-21 14:34:07 -070017868 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017869
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017870 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017871 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017872 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017873 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017874 copy_region.srcSubresource.mipLevel = 0;
17875 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017876 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017877 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017878 copy_region.srcSubresource.layerCount = 1;
17879 copy_region.dstSubresource.layerCount = 1;
17880 copy_region.srcOffset = {0, 0, 0};
17881 copy_region.dstOffset = {0, 0, 0};
17882
17883 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017884 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17885 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017886 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017887
Dave Houltonfc1a4052017-04-27 14:32:45 -060017888 // Source exceeded in x-dim, VU 01202
17889 copy_region.srcOffset.x = 4;
17890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175); // General "contained within" VU
17891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01202);
17892 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17893 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017894 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017895
17896 // Source exceeded in y-dim, VU 01203
17897 copy_region.srcOffset.x = 0;
17898 copy_region.extent.height = 48;
17899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01203);
17901 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17902 &copy_region);
17903 m_errorMonitor->VerifyFound();
17904
17905 // Source exceeded in z-dim, VU 01204
17906 copy_region.extent = {4, 4, 4};
17907 copy_region.srcSubresource.mipLevel = 2;
17908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01204);
17910 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17911 &copy_region);
17912 m_errorMonitor->VerifyFound();
17913
17914 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017915}
17916
17917TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017918 // Image copy with dest region specified greater than dest image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017919 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017920
Dave Houltonfc1a4052017-04-27 14:32:45 -060017921 // Create images with full mip chain
17922 VkImageCreateInfo ci;
17923 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17924 ci.pNext = NULL;
17925 ci.flags = 0;
17926 ci.imageType = VK_IMAGE_TYPE_3D;
17927 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17928 ci.extent = {32, 32, 8};
17929 ci.mipLevels = 6;
17930 ci.arrayLayers = 1;
17931 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17932 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17933 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17934 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17935 ci.queueFamilyIndexCount = 0;
17936 ci.pQueueFamilyIndices = NULL;
17937 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17938
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017939 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017940 dst_image.init(&ci);
17941 ASSERT_TRUE(dst_image.initialized());
17942
17943 // Src image with one more mip level
17944 ci.extent = {64, 64, 16};
17945 ci.mipLevels = 7;
17946 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17947 VkImageObj src_image(m_device);
17948 src_image.init(&ci);
17949 ASSERT_TRUE(src_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017950
Tony Barbour552f6c02016-12-21 14:34:07 -070017951 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017952
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017953 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017954 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017955 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017956 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017957 copy_region.srcSubresource.mipLevel = 0;
17958 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017959 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017960 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017961 copy_region.srcSubresource.layerCount = 1;
17962 copy_region.dstSubresource.layerCount = 1;
17963 copy_region.srcOffset = {0, 0, 0};
17964 copy_region.dstOffset = {0, 0, 0};
17965
17966 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017967 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17968 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017969 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017970
Dave Houltonfc1a4052017-04-27 14:32:45 -060017971 // Dest exceeded in x-dim, VU 01205
17972 copy_region.dstOffset.x = 4;
17973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176); // General "contained within" VU
17974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01205);
17975 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17976 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017977 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017978
17979 // Dest exceeded in y-dim, VU 01206
17980 copy_region.dstOffset.x = 0;
17981 copy_region.extent.height = 48;
17982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01206);
17984 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17985 &copy_region);
17986 m_errorMonitor->VerifyFound();
17987
17988 // Dest exceeded in z-dim, VU 01207
17989 copy_region.extent = {4, 4, 4};
17990 copy_region.dstSubresource.mipLevel = 2;
17991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01207);
17993 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17994 &copy_region);
17995 m_errorMonitor->VerifyFound();
17996
17997 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017998}
17999
Karl Schultz6addd812016-02-02 17:17:23 -070018000TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060018001 VkResult err;
18002 bool pass;
18003
18004 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070018005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060018006
Tony Barbour1fa09702017-03-16 12:09:08 -060018007 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060018008
18009 // Create two images of different types and try to copy between them
18010 VkImage srcImage;
18011 VkImage dstImage;
18012 VkDeviceMemory srcMem;
18013 VkDeviceMemory destMem;
18014 VkMemoryRequirements memReqs;
18015
18016 VkImageCreateInfo image_create_info = {};
18017 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18018 image_create_info.pNext = NULL;
18019 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18020 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18021 image_create_info.extent.width = 32;
18022 image_create_info.extent.height = 32;
18023 image_create_info.extent.depth = 1;
18024 image_create_info.mipLevels = 1;
18025 image_create_info.arrayLayers = 1;
18026 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18027 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18028 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18029 image_create_info.flags = 0;
18030
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018031 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060018032 ASSERT_VK_SUCCESS(err);
18033
18034 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18035 // Introduce failure by creating second image with a different-sized format.
18036 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018037 VkFormatProperties properties;
18038 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
18039 if (properties.optimalTilingFeatures == 0) {
18040 printf(" Image format not supported; skipped.\n");
18041 return;
18042 }
Karl Schultzbdb75952016-04-19 11:36:49 -060018043
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018044 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060018045 ASSERT_VK_SUCCESS(err);
18046
18047 // Allocate memory
18048 VkMemoryAllocateInfo memAlloc = {};
18049 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18050 memAlloc.pNext = NULL;
18051 memAlloc.allocationSize = 0;
18052 memAlloc.memoryTypeIndex = 0;
18053
18054 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
18055 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018056 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060018057 ASSERT_TRUE(pass);
18058 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
18059 ASSERT_VK_SUCCESS(err);
18060
18061 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
18062 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018063 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060018064 ASSERT_TRUE(pass);
18065 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
18066 ASSERT_VK_SUCCESS(err);
18067
18068 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18069 ASSERT_VK_SUCCESS(err);
18070 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
18071 ASSERT_VK_SUCCESS(err);
18072
Tony Barbour552f6c02016-12-21 14:34:07 -070018073 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060018074 VkImageCopy copyRegion;
18075 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18076 copyRegion.srcSubresource.mipLevel = 0;
18077 copyRegion.srcSubresource.baseArrayLayer = 0;
18078 copyRegion.srcSubresource.layerCount = 0;
18079 copyRegion.srcOffset.x = 0;
18080 copyRegion.srcOffset.y = 0;
18081 copyRegion.srcOffset.z = 0;
18082 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18083 copyRegion.dstSubresource.mipLevel = 0;
18084 copyRegion.dstSubresource.baseArrayLayer = 0;
18085 copyRegion.dstSubresource.layerCount = 0;
18086 copyRegion.dstOffset.x = 0;
18087 copyRegion.dstOffset.y = 0;
18088 copyRegion.dstOffset.z = 0;
18089 copyRegion.extent.width = 1;
18090 copyRegion.extent.height = 1;
18091 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018092 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018093 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060018094
18095 m_errorMonitor->VerifyFound();
18096
18097 vkDestroyImage(m_device->device(), srcImage, NULL);
18098 vkDestroyImage(m_device->device(), dstImage, NULL);
18099 vkFreeMemory(m_device->device(), srcMem, NULL);
18100 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018101}
18102
Karl Schultz6addd812016-02-02 17:17:23 -070018103TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
18104 VkResult err;
18105 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018106
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018107 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18109 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018110
Tony Barbour1fa09702017-03-16 12:09:08 -060018111 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018112 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018113 if (!depth_format) {
18114 return;
18115 }
Mike Stroyana3082432015-09-25 13:39:21 -060018116
18117 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018118 VkImage srcImage;
18119 VkImage dstImage;
18120 VkDeviceMemory srcMem;
18121 VkDeviceMemory destMem;
18122 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018123
18124 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018125 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18126 image_create_info.pNext = NULL;
18127 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018128 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070018129 image_create_info.extent.width = 32;
18130 image_create_info.extent.height = 32;
18131 image_create_info.extent.depth = 1;
18132 image_create_info.mipLevels = 1;
18133 image_create_info.arrayLayers = 1;
18134 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060018135 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070018136 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18137 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018138 VkFormatProperties properties;
18139 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
18140 if (properties.optimalTilingFeatures == 0) {
18141 printf(" Image format not supported; skipped.\n");
18142 return;
18143 }
Mike Stroyana3082432015-09-25 13:39:21 -060018144
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018145 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018146 ASSERT_VK_SUCCESS(err);
18147
Karl Schultzbdb75952016-04-19 11:36:49 -060018148 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18149
Mark Lobodzinskidb117632016-03-31 10:45:56 -060018150 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070018151 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070018152 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060018153 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018154
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018155 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018156 ASSERT_VK_SUCCESS(err);
18157
18158 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018159 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018160 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18161 memAlloc.pNext = NULL;
18162 memAlloc.allocationSize = 0;
18163 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018164
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018165 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018166 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018167 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018168 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018169 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018170 ASSERT_VK_SUCCESS(err);
18171
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018172 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018173 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018174 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018175 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018176 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018177 ASSERT_VK_SUCCESS(err);
18178
18179 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18180 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018181 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018182 ASSERT_VK_SUCCESS(err);
18183
Tony Barbour552f6c02016-12-21 14:34:07 -070018184 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018185 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018186 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018187 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018188 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018189 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018190 copyRegion.srcOffset.x = 0;
18191 copyRegion.srcOffset.y = 0;
18192 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018193 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018194 copyRegion.dstSubresource.mipLevel = 0;
18195 copyRegion.dstSubresource.baseArrayLayer = 0;
18196 copyRegion.dstSubresource.layerCount = 0;
18197 copyRegion.dstOffset.x = 0;
18198 copyRegion.dstOffset.y = 0;
18199 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018200 copyRegion.extent.width = 1;
18201 copyRegion.extent.height = 1;
18202 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018203 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018204 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018205
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018206 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018207
Chia-I Wuf7458c52015-10-26 21:10:41 +080018208 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018209 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018210 vkFreeMemory(m_device->device(), srcMem, NULL);
18211 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018212}
18213
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018214TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
18215 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070018216
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018217 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070018218
18219 VkImageFormatProperties image_format_properties;
18220 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
18221 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
18222 &image_format_properties);
18223
18224 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
18225 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
18226 printf(" Image multi-sample support not found; skipped.\n");
18227 return;
18228 }
18229
18230 VkImageCreateInfo ci;
18231 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18232 ci.pNext = NULL;
18233 ci.flags = 0;
18234 ci.imageType = VK_IMAGE_TYPE_2D;
18235 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
18236 ci.extent = {128, 128, 1};
18237 ci.mipLevels = 1;
18238 ci.arrayLayers = 1;
18239 ci.samples = VK_SAMPLE_COUNT_1_BIT;
18240 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
18241 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18242 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18243 ci.queueFamilyIndexCount = 0;
18244 ci.pQueueFamilyIndices = NULL;
18245 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18246
18247 VkImageObj image1(m_device);
18248 image1.init(&ci);
18249 ASSERT_TRUE(image1.initialized());
18250
18251 ci.samples = VK_SAMPLE_COUNT_2_BIT;
18252 VkImageObj image2(m_device);
18253 image2.init(&ci);
18254 ASSERT_TRUE(image2.initialized());
18255
18256 ci.samples = VK_SAMPLE_COUNT_4_BIT;
18257 VkImageObj image4(m_device);
18258 image4.init(&ci);
18259 ASSERT_TRUE(image4.initialized());
18260
18261 m_commandBuffer->BeginCommandBuffer();
18262
18263 VkImageCopy copyRegion;
18264 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18265 copyRegion.srcSubresource.mipLevel = 0;
18266 copyRegion.srcSubresource.baseArrayLayer = 0;
18267 copyRegion.srcSubresource.layerCount = 1;
18268 copyRegion.srcOffset = {0, 0, 0};
18269 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18270 copyRegion.dstSubresource.mipLevel = 0;
18271 copyRegion.dstSubresource.baseArrayLayer = 0;
18272 copyRegion.dstSubresource.layerCount = 1;
18273 copyRegion.dstOffset = {0, 0, 0};
18274 copyRegion.extent = {128, 128, 1};
18275
18276 // Copy a single sample image to/from a multi-sample image
18277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18278 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18279 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18280 m_errorMonitor->VerifyFound();
18281
18282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18283 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
18284 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18285 m_errorMonitor->VerifyFound();
18286
18287 // Copy between multi-sample images with different sample counts
18288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18289 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18290 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18291 m_errorMonitor->VerifyFound();
18292
18293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18294 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
18295 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18296 m_errorMonitor->VerifyFound();
18297
18298 m_commandBuffer->EndCommandBuffer();
18299}
18300
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018301TEST_F(VkLayerTest, CopyImageAspectMismatch) {
18302 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018303 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018304 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060018305 if (!ds_format) {
18306 return;
18307 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018308
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018309 VkFormatProperties properties;
18310 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
18311 if (properties.optimalTilingFeatures == 0) {
18312 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
18313 return;
18314 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018315 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018316 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 -060018317 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 -060018318 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018319 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
18320 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018321 ASSERT_TRUE(color_image.initialized());
18322 ASSERT_TRUE(depth_image.initialized());
18323 ASSERT_TRUE(ds_image.initialized());
18324
18325 VkImageCopy copyRegion;
18326 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18327 copyRegion.srcSubresource.mipLevel = 0;
18328 copyRegion.srcSubresource.baseArrayLayer = 0;
18329 copyRegion.srcSubresource.layerCount = 1;
18330 copyRegion.srcOffset = {0, 0, 0};
18331 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18332 copyRegion.dstSubresource.mipLevel = 0;
18333 copyRegion.dstSubresource.baseArrayLayer = 0;
18334 copyRegion.dstSubresource.layerCount = 1;
18335 copyRegion.dstOffset = {64, 0, 0};
18336 copyRegion.extent = {64, 128, 1};
18337
18338 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060018339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18340 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
18341 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18342 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018343 m_errorMonitor->VerifyFound();
18344
18345 m_commandBuffer->BeginCommandBuffer();
18346
18347 // Src and dest aspect masks don't match
18348 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
18349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018350 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
18351 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018352 m_errorMonitor->VerifyFound();
18353 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18354
18355 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060018356 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018357 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
18358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
18359 // These aspect/format mismatches are redundant but unavoidable here
18360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018362 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18363 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018364 m_errorMonitor->VerifyFound();
18365 // Metadata aspect is illegal - VU 01222
18366 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18367 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
18369 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060018370 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18371 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018372 m_errorMonitor->VerifyFound();
18373
18374 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18375 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18376
18377 // Aspect mask doesn't match source image format - VU 01200
18378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18379 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
18380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18381 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18382 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18383 m_errorMonitor->VerifyFound();
18384
18385 // Aspect mask doesn't match dest image format - VU 01201
18386 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18387 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
18389 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
18390 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18391 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18392 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18393 m_errorMonitor->VerifyFound();
18394
18395 m_commandBuffer->EndCommandBuffer();
18396}
18397
Karl Schultz6addd812016-02-02 17:17:23 -070018398TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
18399 VkResult err;
18400 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018401
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18403 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018404
Tony Barbour1fa09702017-03-16 12:09:08 -060018405 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018406
18407 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018408 VkImage srcImage;
18409 VkImage dstImage;
18410 VkDeviceMemory srcMem;
18411 VkDeviceMemory destMem;
18412 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018413
18414 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018415 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18416 image_create_info.pNext = NULL;
18417 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18418 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18419 image_create_info.extent.width = 32;
18420 image_create_info.extent.height = 1;
18421 image_create_info.extent.depth = 1;
18422 image_create_info.mipLevels = 1;
18423 image_create_info.arrayLayers = 1;
18424 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18425 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18426 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18427 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018428
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018429 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018430 ASSERT_VK_SUCCESS(err);
18431
Karl Schultz6addd812016-02-02 17:17:23 -070018432 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018433
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018434 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018435 ASSERT_VK_SUCCESS(err);
18436
18437 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018438 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018439 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18440 memAlloc.pNext = NULL;
18441 memAlloc.allocationSize = 0;
18442 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018443
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018444 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018445 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018446 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018447 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018448 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018449 ASSERT_VK_SUCCESS(err);
18450
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018451 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018452 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018453 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018454 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018455 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018456 ASSERT_VK_SUCCESS(err);
18457
18458 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18459 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018460 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018461 ASSERT_VK_SUCCESS(err);
18462
Tony Barbour552f6c02016-12-21 14:34:07 -070018463 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018464 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018465 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18466 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018467 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018468 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018469 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018470 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018471 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018472 resolveRegion.srcOffset.x = 0;
18473 resolveRegion.srcOffset.y = 0;
18474 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018475 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018476 resolveRegion.dstSubresource.mipLevel = 0;
18477 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018478 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018479 resolveRegion.dstOffset.x = 0;
18480 resolveRegion.dstOffset.y = 0;
18481 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018482 resolveRegion.extent.width = 1;
18483 resolveRegion.extent.height = 1;
18484 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018485 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018486 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018487
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018488 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018489
Chia-I Wuf7458c52015-10-26 21:10:41 +080018490 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018491 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018492 vkFreeMemory(m_device->device(), srcMem, NULL);
18493 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018494}
18495
Karl Schultz6addd812016-02-02 17:17:23 -070018496TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
18497 VkResult err;
18498 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018499
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18501 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018502
Tony Barbour1fa09702017-03-16 12:09:08 -060018503 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018504
Chris Forbesa7530692016-05-08 12:35:39 +120018505 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018506 VkImage srcImage;
18507 VkImage dstImage;
18508 VkDeviceMemory srcMem;
18509 VkDeviceMemory destMem;
18510 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018511
18512 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018513 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18514 image_create_info.pNext = NULL;
18515 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18516 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18517 image_create_info.extent.width = 32;
18518 image_create_info.extent.height = 1;
18519 image_create_info.extent.depth = 1;
18520 image_create_info.mipLevels = 1;
18521 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120018522 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018523 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18524 // Note: Some implementations expect color attachment usage for any
18525 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018526 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018527 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018528
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018529 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018530 ASSERT_VK_SUCCESS(err);
18531
Karl Schultz6addd812016-02-02 17:17:23 -070018532 // Note: Some implementations expect color attachment usage for any
18533 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018534 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018535
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018536 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018537 ASSERT_VK_SUCCESS(err);
18538
18539 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018540 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018541 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18542 memAlloc.pNext = NULL;
18543 memAlloc.allocationSize = 0;
18544 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018545
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018546 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018547 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018548 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018549 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018550 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018551 ASSERT_VK_SUCCESS(err);
18552
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018553 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018554 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018555 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018556 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018557 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018558 ASSERT_VK_SUCCESS(err);
18559
18560 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18561 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018562 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018563 ASSERT_VK_SUCCESS(err);
18564
Tony Barbour552f6c02016-12-21 14:34:07 -070018565 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018566 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018567 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18568 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018569 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018570 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018571 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018572 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018573 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018574 resolveRegion.srcOffset.x = 0;
18575 resolveRegion.srcOffset.y = 0;
18576 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018577 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018578 resolveRegion.dstSubresource.mipLevel = 0;
18579 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018580 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018581 resolveRegion.dstOffset.x = 0;
18582 resolveRegion.dstOffset.y = 0;
18583 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018584 resolveRegion.extent.width = 1;
18585 resolveRegion.extent.height = 1;
18586 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018587 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018588 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018589
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018590 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018591
Chia-I Wuf7458c52015-10-26 21:10:41 +080018592 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018593 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018594 vkFreeMemory(m_device->device(), srcMem, NULL);
18595 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018596}
18597
Karl Schultz6addd812016-02-02 17:17:23 -070018598TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
18599 VkResult err;
18600 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018601
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018603 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018604
Tony Barbour1fa09702017-03-16 12:09:08 -060018605 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018606
18607 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018608 VkImage srcImage;
18609 VkImage dstImage;
18610 VkDeviceMemory srcMem;
18611 VkDeviceMemory destMem;
18612 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018613
18614 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018615 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18616 image_create_info.pNext = NULL;
18617 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18618 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18619 image_create_info.extent.width = 32;
18620 image_create_info.extent.height = 1;
18621 image_create_info.extent.depth = 1;
18622 image_create_info.mipLevels = 1;
18623 image_create_info.arrayLayers = 1;
18624 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18625 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18626 // Note: Some implementations expect color attachment usage for any
18627 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018628 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018629 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018630
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018631 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018632 ASSERT_VK_SUCCESS(err);
18633
Karl Schultz6addd812016-02-02 17:17:23 -070018634 // Set format to something other than source image
18635 image_create_info.format = VK_FORMAT_R32_SFLOAT;
18636 // Note: Some implementations expect color attachment usage for any
18637 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018638 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018639 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018640
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018641 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018642 ASSERT_VK_SUCCESS(err);
18643
18644 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018645 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018646 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18647 memAlloc.pNext = NULL;
18648 memAlloc.allocationSize = 0;
18649 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018650
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018651 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018652 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018653 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018654 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018655 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018656 ASSERT_VK_SUCCESS(err);
18657
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018658 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018659 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018660 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018661 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018662 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018663 ASSERT_VK_SUCCESS(err);
18664
18665 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18666 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018667 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018668 ASSERT_VK_SUCCESS(err);
18669
Tony Barbour552f6c02016-12-21 14:34:07 -070018670 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018671 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018672 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18673 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018674 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018675 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018676 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018677 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018678 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018679 resolveRegion.srcOffset.x = 0;
18680 resolveRegion.srcOffset.y = 0;
18681 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018682 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018683 resolveRegion.dstSubresource.mipLevel = 0;
18684 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018685 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018686 resolveRegion.dstOffset.x = 0;
18687 resolveRegion.dstOffset.y = 0;
18688 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018689 resolveRegion.extent.width = 1;
18690 resolveRegion.extent.height = 1;
18691 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018692 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018693 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018694
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018695 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018696
Chia-I Wuf7458c52015-10-26 21:10:41 +080018697 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018698 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018699 vkFreeMemory(m_device->device(), srcMem, NULL);
18700 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018701}
18702
Karl Schultz6addd812016-02-02 17:17:23 -070018703TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
18704 VkResult err;
18705 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018706
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018708 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018709
Tony Barbour1fa09702017-03-16 12:09:08 -060018710 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018711
18712 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018713 VkImage srcImage;
18714 VkImage dstImage;
18715 VkDeviceMemory srcMem;
18716 VkDeviceMemory destMem;
18717 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018718
18719 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018720 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18721 image_create_info.pNext = NULL;
18722 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18723 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18724 image_create_info.extent.width = 32;
18725 image_create_info.extent.height = 1;
18726 image_create_info.extent.depth = 1;
18727 image_create_info.mipLevels = 1;
18728 image_create_info.arrayLayers = 1;
18729 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18730 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18731 // Note: Some implementations expect color attachment usage for any
18732 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018733 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018734 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018735
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018736 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018737 ASSERT_VK_SUCCESS(err);
18738
Karl Schultz6addd812016-02-02 17:17:23 -070018739 image_create_info.imageType = VK_IMAGE_TYPE_1D;
18740 // Note: Some implementations expect color attachment usage for any
18741 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018742 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018743 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018744
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018745 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018746 ASSERT_VK_SUCCESS(err);
18747
18748 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018749 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018750 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18751 memAlloc.pNext = NULL;
18752 memAlloc.allocationSize = 0;
18753 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018754
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018755 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018756 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018757 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018758 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018759 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018760 ASSERT_VK_SUCCESS(err);
18761
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018762 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018763 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018764 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018765 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018766 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018767 ASSERT_VK_SUCCESS(err);
18768
18769 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18770 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018771 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018772 ASSERT_VK_SUCCESS(err);
18773
Tony Barbour552f6c02016-12-21 14:34:07 -070018774 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018775 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018776 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18777 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018778 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018779 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018780 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018781 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018782 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018783 resolveRegion.srcOffset.x = 0;
18784 resolveRegion.srcOffset.y = 0;
18785 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018786 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018787 resolveRegion.dstSubresource.mipLevel = 0;
18788 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018789 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018790 resolveRegion.dstOffset.x = 0;
18791 resolveRegion.dstOffset.y = 0;
18792 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018793 resolveRegion.extent.width = 1;
18794 resolveRegion.extent.height = 1;
18795 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018796 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018797 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018798
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018799 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018800
Chia-I Wuf7458c52015-10-26 21:10:41 +080018801 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018802 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018803 vkFreeMemory(m_device->device(), srcMem, NULL);
18804 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018805}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018806
Karl Schultz6addd812016-02-02 17:17:23 -070018807TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018808 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070018809 // to using a DS format, then cause it to hit error due to COLOR_BIT not
18810 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018811 // The image format check comes 2nd in validation so we trigger it first,
18812 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070018813 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018814
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18816 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018817
Tony Barbour1fa09702017-03-16 12:09:08 -060018818 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018819 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018820 if (!depth_format) {
18821 return;
18822 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018823
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018824 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018825 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18826 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018827
18828 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018829 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18830 ds_pool_ci.pNext = NULL;
18831 ds_pool_ci.maxSets = 1;
18832 ds_pool_ci.poolSizeCount = 1;
18833 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018834
18835 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018836 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018837 ASSERT_VK_SUCCESS(err);
18838
18839 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018840 dsl_binding.binding = 0;
18841 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18842 dsl_binding.descriptorCount = 1;
18843 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18844 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018845
18846 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018847 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18848 ds_layout_ci.pNext = NULL;
18849 ds_layout_ci.bindingCount = 1;
18850 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018851 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018852 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018853 ASSERT_VK_SUCCESS(err);
18854
18855 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018856 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018857 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018858 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018859 alloc_info.descriptorPool = ds_pool;
18860 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018861 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018862 ASSERT_VK_SUCCESS(err);
18863
Karl Schultz6addd812016-02-02 17:17:23 -070018864 VkImage image_bad;
18865 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018866 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018867 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018868 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018869 const int32_t tex_width = 32;
18870 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018871
18872 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018873 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18874 image_create_info.pNext = NULL;
18875 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18876 image_create_info.format = tex_format_bad;
18877 image_create_info.extent.width = tex_width;
18878 image_create_info.extent.height = tex_height;
18879 image_create_info.extent.depth = 1;
18880 image_create_info.mipLevels = 1;
18881 image_create_info.arrayLayers = 1;
18882 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18883 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018884 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018885 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018886
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018887 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018888 ASSERT_VK_SUCCESS(err);
18889 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018890 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18891 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018892 ASSERT_VK_SUCCESS(err);
18893
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018894 // ---Bind image memory---
18895 VkMemoryRequirements img_mem_reqs;
18896 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18897 VkMemoryAllocateInfo image_alloc_info = {};
18898 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18899 image_alloc_info.pNext = NULL;
18900 image_alloc_info.memoryTypeIndex = 0;
18901 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018902 bool pass =
18903 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 -070018904 ASSERT_TRUE(pass);
18905 VkDeviceMemory mem;
18906 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18907 ASSERT_VK_SUCCESS(err);
18908 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18909 ASSERT_VK_SUCCESS(err);
18910 // -----------------------
18911
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018912 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018913 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018914 image_view_create_info.image = image_bad;
18915 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18916 image_view_create_info.format = tex_format_bad;
18917 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18918 image_view_create_info.subresourceRange.baseMipLevel = 0;
18919 image_view_create_info.subresourceRange.layerCount = 1;
18920 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018921 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018922
18923 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018924 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018925
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018926 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018927
Chia-I Wuf7458c52015-10-26 21:10:41 +080018928 vkDestroyImage(m_device->device(), image_bad, NULL);
18929 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018930 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18931 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018932
18933 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018934}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018935
18936TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018937 TEST_DESCRIPTION(
18938 "Call ClearColorImage w/ a depth|stencil image and "
18939 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018940
Tony Barbour1fa09702017-03-16 12:09:08 -060018941 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018942 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018943 if (!depth_format) {
18944 return;
18945 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018946 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18947
Tony Barbour552f6c02016-12-21 14:34:07 -070018948 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018949
18950 // Color image
18951 VkClearColorValue clear_color;
18952 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18953 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18954 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18955 const int32_t img_width = 32;
18956 const int32_t img_height = 32;
18957 VkImageCreateInfo image_create_info = {};
18958 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18959 image_create_info.pNext = NULL;
18960 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18961 image_create_info.format = color_format;
18962 image_create_info.extent.width = img_width;
18963 image_create_info.extent.height = img_height;
18964 image_create_info.extent.depth = 1;
18965 image_create_info.mipLevels = 1;
18966 image_create_info.arrayLayers = 1;
18967 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18968 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18969 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18970
18971 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018972 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018973
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018974 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018975
18976 // Depth/Stencil image
18977 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018978 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018979 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18980 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018981 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018982 ds_image_create_info.extent.width = 64;
18983 ds_image_create_info.extent.height = 64;
18984 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018985 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 -060018986
18987 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018988 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018989
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018990 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 -060018991
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018993
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018994 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018995 &color_range);
18996
18997 m_errorMonitor->VerifyFound();
18998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19000 "vkCmdClearColorImage called with "
19001 "image created without "
19002 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060019003
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070019004 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060019005 &color_range);
19006
19007 m_errorMonitor->VerifyFound();
19008
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019009 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19011 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019012
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019013 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
19014 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060019015
19016 m_errorMonitor->VerifyFound();
19017}
Tobin Ehliscde08892015-09-22 10:11:37 -060019018
Mike Schuchardt35fece12017-03-07 14:40:28 -070019019TEST_F(VkLayerTest, CommandQueueFlags) {
19020 TEST_DESCRIPTION(
19021 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
19022 "graphics-only command");
19023
19024 ASSERT_NO_FATAL_FAILURE(Init());
19025
19026 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060019027 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070019028 printf(" Non-graphics queue family not found; skipped.\n");
19029 return;
19030 } else {
19031 // Create command pool on a non-graphics queue
19032 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
19033
19034 // Setup command buffer on pool
19035 VkCommandBufferObj command_buffer(m_device, &command_pool);
19036 command_buffer.BeginCommandBuffer();
19037
19038 // Issue a graphics only command
19039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
19040 VkViewport viewport = {0, 0, 16, 16, 0, 1};
19041 command_buffer.SetViewport(0, 1, &viewport);
19042 m_errorMonitor->VerifyFound();
19043 }
19044}
19045
Mark Lobodzinskib8359282017-05-16 09:17:51 -060019046TEST_F(VkLayerTest, ExecuteUnrecordedCBs) {
19047 TEST_DESCRIPTION(
19048 "Attempt vkCmdExecuteCommands and then QueueSubmit with an unrecorded secondary and primary command buffer, respectively");
19049
19050 ASSERT_NO_FATAL_FAILURE(Init());
19051 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00155);
19053 // Allocate a secondary command buffer
19054 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19055 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19056 command_buffer_allocate_info.commandPool = m_commandPool->handle();
19057 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19058 command_buffer_allocate_info.commandBufferCount = 1;
19059 VkCommandBuffer secondary_command_buffer;
19060 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19061 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19062 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19063 command_buffer_begin_info.flags =
19064 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
19065 command_buffer_begin_info.pInheritanceInfo = nullptr;
19066
19067 // Now update primary cmd buffer to execute unrecorded secondary
19068 VkResult err = vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
19069 ASSERT_VK_SUCCESS(err);
19070 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
19071 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
19072 vkCmdEndRenderPass(m_commandBuffer->handle());
19073 err = vkEndCommandBuffer(m_commandBuffer->handle());
19074 ASSERT_VK_SUCCESS(err);
19075 m_errorMonitor->VerifyFound();
19076
19077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00134);
19078 // Allocate a primary command buffer
19079 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19080 command_buffer_allocate_info.commandBufferCount = 1;
19081 VkCommandBuffer primary_command_buffer;
19082 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
19083
19084 // And submit the unrecorded command buffer
19085 VkSubmitInfo submit_info = {};
19086 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19087 submit_info.commandBufferCount = 1;
19088 submit_info.pCommandBuffers = &primary_command_buffer;
19089 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19090 m_errorMonitor->VerifyFound();
19091}
19092
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019093// WSI Enabled Tests
19094//
Chris Forbes09368e42016-10-13 11:59:22 +130019095#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019096TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
19097
19098#if defined(VK_USE_PLATFORM_XCB_KHR)
19099 VkSurfaceKHR surface = VK_NULL_HANDLE;
19100
19101 VkResult err;
19102 bool pass;
19103 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
19104 VkSwapchainCreateInfoKHR swapchain_create_info = {};
19105 // uint32_t swapchain_image_count = 0;
19106 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
19107 // uint32_t image_index = 0;
19108 // VkPresentInfoKHR present_info = {};
19109
Tony Barbour1fa09702017-03-16 12:09:08 -060019110 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019111
19112 // Use the create function from one of the VK_KHR_*_surface extension in
19113 // order to create a surface, testing all known errors in the process,
19114 // before successfully creating a surface:
19115 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
19116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
19117 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
19118 pass = (err != VK_SUCCESS);
19119 ASSERT_TRUE(pass);
19120 m_errorMonitor->VerifyFound();
19121
19122 // Next, try to create a surface with the wrong
19123 // VkXcbSurfaceCreateInfoKHR::sType:
19124 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
19125 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
19126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
19127 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
19128 pass = (err != VK_SUCCESS);
19129 ASSERT_TRUE(pass);
19130 m_errorMonitor->VerifyFound();
19131
19132 // Create a native window, and then correctly create a surface:
19133 xcb_connection_t *connection;
19134 xcb_screen_t *screen;
19135 xcb_window_t xcb_window;
19136 xcb_intern_atom_reply_t *atom_wm_delete_window;
19137
19138 const xcb_setup_t *setup;
19139 xcb_screen_iterator_t iter;
19140 int scr;
19141 uint32_t value_mask, value_list[32];
19142 int width = 1;
19143 int height = 1;
19144
19145 connection = xcb_connect(NULL, &scr);
19146 ASSERT_TRUE(connection != NULL);
19147 setup = xcb_get_setup(connection);
19148 iter = xcb_setup_roots_iterator(setup);
19149 while (scr-- > 0)
19150 xcb_screen_next(&iter);
19151 screen = iter.data;
19152
19153 xcb_window = xcb_generate_id(connection);
19154
19155 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
19156 value_list[0] = screen->black_pixel;
19157 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
19158
19159 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
19160 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
19161
19162 /* Magic code that will send notification when window is destroyed */
19163 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
19164 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
19165
19166 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
19167 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
19168 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
19169 free(reply);
19170
19171 xcb_map_window(connection, xcb_window);
19172
19173 // Force the x/y coordinates to 100,100 results are identical in consecutive
19174 // runs
19175 const uint32_t coords[] = { 100, 100 };
19176 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
19177
19178 // Finally, try to correctly create a surface:
19179 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
19180 xcb_create_info.pNext = NULL;
19181 xcb_create_info.flags = 0;
19182 xcb_create_info.connection = connection;
19183 xcb_create_info.window = xcb_window;
19184 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
19185 pass = (err == VK_SUCCESS);
19186 ASSERT_TRUE(pass);
19187
19188 // Check if surface supports presentation:
19189
19190 // 1st, do so without having queried the queue families:
19191 VkBool32 supported = false;
19192 // TODO: Get the following error to come out:
19193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19194 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
19195 "function");
19196 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19197 pass = (err != VK_SUCCESS);
19198 // ASSERT_TRUE(pass);
19199 // m_errorMonitor->VerifyFound();
19200
19201 // Next, query a queue family index that's too large:
19202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19203 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
19204 pass = (err != VK_SUCCESS);
19205 ASSERT_TRUE(pass);
19206 m_errorMonitor->VerifyFound();
19207
19208 // Finally, do so correctly:
19209 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19210 // SUPPORTED
19211 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19212 pass = (err == VK_SUCCESS);
19213 ASSERT_TRUE(pass);
19214
19215 // Before proceeding, try to create a swapchain without having called
19216 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
19217 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19218 swapchain_create_info.pNext = NULL;
19219 swapchain_create_info.flags = 0;
19220 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
19221 swapchain_create_info.surface = surface;
19222 swapchain_create_info.imageArrayLayers = 1;
19223 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
19224 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
19225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19226 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
19227 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19228 pass = (err != VK_SUCCESS);
19229 ASSERT_TRUE(pass);
19230 m_errorMonitor->VerifyFound();
19231
19232 // Get the surface capabilities:
19233 VkSurfaceCapabilitiesKHR surface_capabilities;
19234
19235 // Do so correctly (only error logged by this entrypoint is if the
19236 // extension isn't enabled):
19237 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
19238 pass = (err == VK_SUCCESS);
19239 ASSERT_TRUE(pass);
19240
19241 // Get the surface formats:
19242 uint32_t surface_format_count;
19243
19244 // First, try without a pointer to surface_format_count:
19245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
19246 "specified as NULL");
19247 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
19248 pass = (err == VK_SUCCESS);
19249 ASSERT_TRUE(pass);
19250 m_errorMonitor->VerifyFound();
19251
19252 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
19253 // correctly done a 1st try (to get the count):
19254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19255 surface_format_count = 0;
19256 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
19257 pass = (err == VK_SUCCESS);
19258 ASSERT_TRUE(pass);
19259 m_errorMonitor->VerifyFound();
19260
19261 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19262 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19263 pass = (err == VK_SUCCESS);
19264 ASSERT_TRUE(pass);
19265
19266 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19267 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
19268
19269 // Next, do a 2nd try with surface_format_count being set too high:
19270 surface_format_count += 5;
19271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19272 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19273 pass = (err == VK_SUCCESS);
19274 ASSERT_TRUE(pass);
19275 m_errorMonitor->VerifyFound();
19276
19277 // Finally, do a correct 1st and 2nd try:
19278 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19279 pass = (err == VK_SUCCESS);
19280 ASSERT_TRUE(pass);
19281 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19282 pass = (err == VK_SUCCESS);
19283 ASSERT_TRUE(pass);
19284
19285 // Get the surface present modes:
19286 uint32_t surface_present_mode_count;
19287
19288 // First, try without a pointer to surface_format_count:
19289 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
19290 "specified as NULL");
19291
19292 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
19293 pass = (err == VK_SUCCESS);
19294 ASSERT_TRUE(pass);
19295 m_errorMonitor->VerifyFound();
19296
19297 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
19298 // correctly done a 1st try (to get the count):
19299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19300 surface_present_mode_count = 0;
19301 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
19302 (VkPresentModeKHR *)&surface_present_mode_count);
19303 pass = (err == VK_SUCCESS);
19304 ASSERT_TRUE(pass);
19305 m_errorMonitor->VerifyFound();
19306
19307 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19308 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19309 pass = (err == VK_SUCCESS);
19310 ASSERT_TRUE(pass);
19311
19312 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19313 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
19314
19315 // Next, do a 2nd try with surface_format_count being set too high:
19316 surface_present_mode_count += 5;
19317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19318 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19319 pass = (err == VK_SUCCESS);
19320 ASSERT_TRUE(pass);
19321 m_errorMonitor->VerifyFound();
19322
19323 // Finally, do a correct 1st and 2nd try:
19324 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19325 pass = (err == VK_SUCCESS);
19326 ASSERT_TRUE(pass);
19327 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19328 pass = (err == VK_SUCCESS);
19329 ASSERT_TRUE(pass);
19330
19331 // Create a swapchain:
19332
19333 // First, try without a pointer to swapchain_create_info:
19334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
19335 "specified as NULL");
19336
19337 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
19338 pass = (err != VK_SUCCESS);
19339 ASSERT_TRUE(pass);
19340 m_errorMonitor->VerifyFound();
19341
19342 // Next, call with a non-NULL swapchain_create_info, that has the wrong
19343 // sType:
19344 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
19345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
19346
19347 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19348 pass = (err != VK_SUCCESS);
19349 ASSERT_TRUE(pass);
19350 m_errorMonitor->VerifyFound();
19351
19352 // Next, call with a NULL swapchain pointer:
19353 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19354 swapchain_create_info.pNext = NULL;
19355 swapchain_create_info.flags = 0;
19356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
19357 "specified as NULL");
19358
19359 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
19360 pass = (err != VK_SUCCESS);
19361 ASSERT_TRUE(pass);
19362 m_errorMonitor->VerifyFound();
19363
19364 // TODO: Enhance swapchain layer so that
19365 // swapchain_create_info.queueFamilyIndexCount is checked against something?
19366
19367 // Next, call with a queue family index that's too large:
19368 uint32_t queueFamilyIndex[2] = { 100000, 0 };
19369 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19370 swapchain_create_info.queueFamilyIndexCount = 2;
19371 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
19372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19373 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19374 pass = (err != VK_SUCCESS);
19375 ASSERT_TRUE(pass);
19376 m_errorMonitor->VerifyFound();
19377
19378 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
19379 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19380 swapchain_create_info.queueFamilyIndexCount = 1;
19381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19382 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
19383 "pCreateInfo->pQueueFamilyIndices).");
19384 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19385 pass = (err != VK_SUCCESS);
19386 ASSERT_TRUE(pass);
19387 m_errorMonitor->VerifyFound();
19388
19389 // Next, call with an invalid imageSharingMode:
19390 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
19391 swapchain_create_info.queueFamilyIndexCount = 1;
19392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19393 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
19394 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19395 pass = (err != VK_SUCCESS);
19396 ASSERT_TRUE(pass);
19397 m_errorMonitor->VerifyFound();
19398 // Fix for the future:
19399 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19400 // SUPPORTED
19401 swapchain_create_info.queueFamilyIndexCount = 0;
19402 queueFamilyIndex[0] = 0;
19403 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
19404
19405 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
19406 // Get the images from a swapchain:
19407 // Acquire an image from a swapchain:
19408 // Present an image to a swapchain:
19409 // Destroy the swapchain:
19410
19411 // TODOs:
19412 //
19413 // - Try destroying the device without first destroying the swapchain
19414 //
19415 // - Try destroying the device without first destroying the surface
19416 //
19417 // - Try destroying the surface without first destroying the swapchain
19418
19419 // Destroy the surface:
19420 vkDestroySurfaceKHR(instance(), surface, NULL);
19421
19422 // Tear down the window:
19423 xcb_destroy_window(connection, xcb_window);
19424 xcb_disconnect(connection);
19425
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019426#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019427 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019428#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019429}
Chris Forbes09368e42016-10-13 11:59:22 +130019430#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019431
19432//
19433// POSITIVE VALIDATION TESTS
19434//
19435// These tests do not expect to encounter ANY validation errors pass only if this is true
19436
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019437TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
19438 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060019439 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019440 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19441
19442 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19443 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019444 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019445 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19446 command_buffer_allocate_info.commandBufferCount = 1;
19447
19448 VkCommandBuffer secondary_command_buffer;
19449 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19450 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19451 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19452 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19453 command_buffer_inheritance_info.renderPass = m_renderPass;
19454 command_buffer_inheritance_info.framebuffer = m_framebuffer;
19455
19456 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19457 command_buffer_begin_info.flags =
19458 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
19459 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19460
19461 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19462 VkClearAttachment color_attachment;
19463 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19464 color_attachment.clearValue.color.float32[0] = 0;
19465 color_attachment.clearValue.color.float32[1] = 0;
19466 color_attachment.clearValue.color.float32[2] = 0;
19467 color_attachment.clearValue.color.float32[3] = 0;
19468 color_attachment.colorAttachment = 0;
19469 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
19470 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
19471}
19472
Tobin Ehlise0006882016-11-03 10:14:28 -060019473TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019474 TEST_DESCRIPTION(
19475 "Perform an image layout transition in a secondary command buffer followed "
19476 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060019477 VkResult err;
19478 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060019479 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060019480 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070019481 if (!depth_format) {
19482 return;
19483 }
Tobin Ehlise0006882016-11-03 10:14:28 -060019484 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19485 // Allocate a secondary and primary cmd buffer
19486 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19487 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019488 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060019489 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19490 command_buffer_allocate_info.commandBufferCount = 1;
19491
19492 VkCommandBuffer secondary_command_buffer;
19493 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19494 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19495 VkCommandBuffer primary_command_buffer;
19496 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
19497 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19498 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19499 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19500 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19501 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
19502 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19503
19504 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19505 ASSERT_VK_SUCCESS(err);
19506 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019507 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 -060019508 ASSERT_TRUE(image.initialized());
19509 VkImageMemoryBarrier img_barrier = {};
19510 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19511 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19512 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19513 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
19514 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19515 img_barrier.image = image.handle();
19516 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19517 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19518 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19519 img_barrier.subresourceRange.baseArrayLayer = 0;
19520 img_barrier.subresourceRange.baseMipLevel = 0;
19521 img_barrier.subresourceRange.layerCount = 1;
19522 img_barrier.subresourceRange.levelCount = 1;
19523 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
19524 0, nullptr, 1, &img_barrier);
19525 err = vkEndCommandBuffer(secondary_command_buffer);
19526 ASSERT_VK_SUCCESS(err);
19527
19528 // Now update primary cmd buffer to execute secondary and transitions image
19529 command_buffer_begin_info.pInheritanceInfo = nullptr;
19530 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
19531 ASSERT_VK_SUCCESS(err);
19532 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
19533 VkImageMemoryBarrier img_barrier2 = {};
19534 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19535 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19536 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19537 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19538 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19539 img_barrier2.image = image.handle();
19540 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19541 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19542 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19543 img_barrier2.subresourceRange.baseArrayLayer = 0;
19544 img_barrier2.subresourceRange.baseMipLevel = 0;
19545 img_barrier2.subresourceRange.layerCount = 1;
19546 img_barrier2.subresourceRange.levelCount = 1;
19547 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
19548 nullptr, 1, &img_barrier2);
19549 err = vkEndCommandBuffer(primary_command_buffer);
19550 ASSERT_VK_SUCCESS(err);
19551 VkSubmitInfo submit_info = {};
19552 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19553 submit_info.commandBufferCount = 1;
19554 submit_info.pCommandBuffers = &primary_command_buffer;
19555 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19556 ASSERT_VK_SUCCESS(err);
19557 m_errorMonitor->VerifyNotFound();
19558 err = vkDeviceWaitIdle(m_device->device());
19559 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070019560 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
19561 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060019562}
19563
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019564// This is a positive test. No failures are expected.
19565TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019566 TEST_DESCRIPTION(
19567 "Ensure that the vkUpdateDescriptorSets validation code "
19568 "is ignoring VkWriteDescriptorSet members that are not "
19569 "related to the descriptor type specified by "
19570 "VkWriteDescriptorSet::descriptorType. Correct "
19571 "validation behavior will result in the test running to "
19572 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019573
19574 const uintptr_t invalid_ptr = 0xcdcdcdcd;
19575
Tony Barbour1fa09702017-03-16 12:09:08 -060019576 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019577
19578 // Image Case
19579 {
19580 m_errorMonitor->ExpectSuccess();
19581
19582 VkImage image;
19583 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
19584 const int32_t tex_width = 32;
19585 const int32_t tex_height = 32;
19586 VkImageCreateInfo image_create_info = {};
19587 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19588 image_create_info.pNext = NULL;
19589 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19590 image_create_info.format = tex_format;
19591 image_create_info.extent.width = tex_width;
19592 image_create_info.extent.height = tex_height;
19593 image_create_info.extent.depth = 1;
19594 image_create_info.mipLevels = 1;
19595 image_create_info.arrayLayers = 1;
19596 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19597 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19598 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
19599 image_create_info.flags = 0;
19600 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19601 ASSERT_VK_SUCCESS(err);
19602
19603 VkMemoryRequirements memory_reqs;
19604 VkDeviceMemory image_memory;
19605 bool pass;
19606 VkMemoryAllocateInfo memory_info = {};
19607 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19608 memory_info.pNext = NULL;
19609 memory_info.allocationSize = 0;
19610 memory_info.memoryTypeIndex = 0;
19611 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19612 memory_info.allocationSize = memory_reqs.size;
19613 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19614 ASSERT_TRUE(pass);
19615 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
19616 ASSERT_VK_SUCCESS(err);
19617 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
19618 ASSERT_VK_SUCCESS(err);
19619
19620 VkImageViewCreateInfo image_view_create_info = {};
19621 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19622 image_view_create_info.image = image;
19623 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
19624 image_view_create_info.format = tex_format;
19625 image_view_create_info.subresourceRange.layerCount = 1;
19626 image_view_create_info.subresourceRange.baseMipLevel = 0;
19627 image_view_create_info.subresourceRange.levelCount = 1;
19628 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19629
19630 VkImageView view;
19631 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
19632 ASSERT_VK_SUCCESS(err);
19633
19634 VkDescriptorPoolSize ds_type_count = {};
19635 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19636 ds_type_count.descriptorCount = 1;
19637
19638 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19639 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19640 ds_pool_ci.pNext = NULL;
19641 ds_pool_ci.maxSets = 1;
19642 ds_pool_ci.poolSizeCount = 1;
19643 ds_pool_ci.pPoolSizes = &ds_type_count;
19644
19645 VkDescriptorPool ds_pool;
19646 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19647 ASSERT_VK_SUCCESS(err);
19648
19649 VkDescriptorSetLayoutBinding dsl_binding = {};
19650 dsl_binding.binding = 0;
19651 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19652 dsl_binding.descriptorCount = 1;
19653 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19654 dsl_binding.pImmutableSamplers = NULL;
19655
19656 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19657 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19658 ds_layout_ci.pNext = NULL;
19659 ds_layout_ci.bindingCount = 1;
19660 ds_layout_ci.pBindings = &dsl_binding;
19661 VkDescriptorSetLayout ds_layout;
19662 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19663 ASSERT_VK_SUCCESS(err);
19664
19665 VkDescriptorSet descriptor_set;
19666 VkDescriptorSetAllocateInfo alloc_info = {};
19667 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19668 alloc_info.descriptorSetCount = 1;
19669 alloc_info.descriptorPool = ds_pool;
19670 alloc_info.pSetLayouts = &ds_layout;
19671 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19672 ASSERT_VK_SUCCESS(err);
19673
19674 VkDescriptorImageInfo image_info = {};
19675 image_info.imageView = view;
19676 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
19677
19678 VkWriteDescriptorSet descriptor_write;
19679 memset(&descriptor_write, 0, sizeof(descriptor_write));
19680 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19681 descriptor_write.dstSet = descriptor_set;
19682 descriptor_write.dstBinding = 0;
19683 descriptor_write.descriptorCount = 1;
19684 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19685 descriptor_write.pImageInfo = &image_info;
19686
19687 // Set pBufferInfo and pTexelBufferView to invalid values, which should
19688 // be
19689 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
19690 // This will most likely produce a crash if the parameter_validation
19691 // layer
19692 // does not correctly ignore pBufferInfo.
19693 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19694 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
19695
19696 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19697
19698 m_errorMonitor->VerifyNotFound();
19699
19700 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19701 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19702 vkDestroyImageView(m_device->device(), view, NULL);
19703 vkDestroyImage(m_device->device(), image, NULL);
19704 vkFreeMemory(m_device->device(), image_memory, NULL);
19705 }
19706
19707 // Buffer Case
19708 {
19709 m_errorMonitor->ExpectSuccess();
19710
19711 VkBuffer buffer;
19712 uint32_t queue_family_index = 0;
19713 VkBufferCreateInfo buffer_create_info = {};
19714 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19715 buffer_create_info.size = 1024;
19716 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19717 buffer_create_info.queueFamilyIndexCount = 1;
19718 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19719
19720 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19721 ASSERT_VK_SUCCESS(err);
19722
19723 VkMemoryRequirements memory_reqs;
19724 VkDeviceMemory buffer_memory;
19725 bool pass;
19726 VkMemoryAllocateInfo memory_info = {};
19727 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19728 memory_info.pNext = NULL;
19729 memory_info.allocationSize = 0;
19730 memory_info.memoryTypeIndex = 0;
19731
19732 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19733 memory_info.allocationSize = memory_reqs.size;
19734 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19735 ASSERT_TRUE(pass);
19736
19737 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19738 ASSERT_VK_SUCCESS(err);
19739 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19740 ASSERT_VK_SUCCESS(err);
19741
19742 VkDescriptorPoolSize ds_type_count = {};
19743 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19744 ds_type_count.descriptorCount = 1;
19745
19746 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19747 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19748 ds_pool_ci.pNext = NULL;
19749 ds_pool_ci.maxSets = 1;
19750 ds_pool_ci.poolSizeCount = 1;
19751 ds_pool_ci.pPoolSizes = &ds_type_count;
19752
19753 VkDescriptorPool ds_pool;
19754 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19755 ASSERT_VK_SUCCESS(err);
19756
19757 VkDescriptorSetLayoutBinding dsl_binding = {};
19758 dsl_binding.binding = 0;
19759 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19760 dsl_binding.descriptorCount = 1;
19761 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19762 dsl_binding.pImmutableSamplers = NULL;
19763
19764 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19765 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19766 ds_layout_ci.pNext = NULL;
19767 ds_layout_ci.bindingCount = 1;
19768 ds_layout_ci.pBindings = &dsl_binding;
19769 VkDescriptorSetLayout ds_layout;
19770 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19771 ASSERT_VK_SUCCESS(err);
19772
19773 VkDescriptorSet descriptor_set;
19774 VkDescriptorSetAllocateInfo alloc_info = {};
19775 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19776 alloc_info.descriptorSetCount = 1;
19777 alloc_info.descriptorPool = ds_pool;
19778 alloc_info.pSetLayouts = &ds_layout;
19779 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19780 ASSERT_VK_SUCCESS(err);
19781
19782 VkDescriptorBufferInfo buffer_info = {};
19783 buffer_info.buffer = buffer;
19784 buffer_info.offset = 0;
19785 buffer_info.range = 1024;
19786
19787 VkWriteDescriptorSet descriptor_write;
19788 memset(&descriptor_write, 0, sizeof(descriptor_write));
19789 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19790 descriptor_write.dstSet = descriptor_set;
19791 descriptor_write.dstBinding = 0;
19792 descriptor_write.descriptorCount = 1;
19793 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19794 descriptor_write.pBufferInfo = &buffer_info;
19795
19796 // Set pImageInfo and pTexelBufferView to invalid values, which should
19797 // be
19798 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
19799 // This will most likely produce a crash if the parameter_validation
19800 // layer
19801 // does not correctly ignore pImageInfo.
19802 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19803 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
19804
19805 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19806
19807 m_errorMonitor->VerifyNotFound();
19808
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019809 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19810 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19811 vkDestroyBuffer(m_device->device(), buffer, NULL);
19812 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19813 }
19814
19815 // Texel Buffer Case
19816 {
19817 m_errorMonitor->ExpectSuccess();
19818
19819 VkBuffer buffer;
19820 uint32_t queue_family_index = 0;
19821 VkBufferCreateInfo buffer_create_info = {};
19822 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19823 buffer_create_info.size = 1024;
19824 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
19825 buffer_create_info.queueFamilyIndexCount = 1;
19826 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19827
19828 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19829 ASSERT_VK_SUCCESS(err);
19830
19831 VkMemoryRequirements memory_reqs;
19832 VkDeviceMemory buffer_memory;
19833 bool pass;
19834 VkMemoryAllocateInfo memory_info = {};
19835 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19836 memory_info.pNext = NULL;
19837 memory_info.allocationSize = 0;
19838 memory_info.memoryTypeIndex = 0;
19839
19840 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19841 memory_info.allocationSize = memory_reqs.size;
19842 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19843 ASSERT_TRUE(pass);
19844
19845 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19846 ASSERT_VK_SUCCESS(err);
19847 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19848 ASSERT_VK_SUCCESS(err);
19849
19850 VkBufferViewCreateInfo buff_view_ci = {};
19851 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
19852 buff_view_ci.buffer = buffer;
19853 buff_view_ci.format = VK_FORMAT_R8_UNORM;
19854 buff_view_ci.range = VK_WHOLE_SIZE;
19855 VkBufferView buffer_view;
19856 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
19857
19858 VkDescriptorPoolSize ds_type_count = {};
19859 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19860 ds_type_count.descriptorCount = 1;
19861
19862 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19863 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19864 ds_pool_ci.pNext = NULL;
19865 ds_pool_ci.maxSets = 1;
19866 ds_pool_ci.poolSizeCount = 1;
19867 ds_pool_ci.pPoolSizes = &ds_type_count;
19868
19869 VkDescriptorPool ds_pool;
19870 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19871 ASSERT_VK_SUCCESS(err);
19872
19873 VkDescriptorSetLayoutBinding dsl_binding = {};
19874 dsl_binding.binding = 0;
19875 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19876 dsl_binding.descriptorCount = 1;
19877 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19878 dsl_binding.pImmutableSamplers = NULL;
19879
19880 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19881 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19882 ds_layout_ci.pNext = NULL;
19883 ds_layout_ci.bindingCount = 1;
19884 ds_layout_ci.pBindings = &dsl_binding;
19885 VkDescriptorSetLayout ds_layout;
19886 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19887 ASSERT_VK_SUCCESS(err);
19888
19889 VkDescriptorSet descriptor_set;
19890 VkDescriptorSetAllocateInfo alloc_info = {};
19891 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19892 alloc_info.descriptorSetCount = 1;
19893 alloc_info.descriptorPool = ds_pool;
19894 alloc_info.pSetLayouts = &ds_layout;
19895 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19896 ASSERT_VK_SUCCESS(err);
19897
19898 VkWriteDescriptorSet descriptor_write;
19899 memset(&descriptor_write, 0, sizeof(descriptor_write));
19900 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19901 descriptor_write.dstSet = descriptor_set;
19902 descriptor_write.dstBinding = 0;
19903 descriptor_write.descriptorCount = 1;
19904 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19905 descriptor_write.pTexelBufferView = &buffer_view;
19906
19907 // Set pImageInfo and pBufferInfo to invalid values, which should be
19908 // ignored for descriptorType ==
19909 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19910 // This will most likely produce a crash if the parameter_validation
19911 // layer
19912 // does not correctly ignore pImageInfo and pBufferInfo.
19913 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19914 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19915
19916 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19917
19918 m_errorMonitor->VerifyNotFound();
19919
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019920 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19921 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19922 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19923 vkDestroyBuffer(m_device->device(), buffer, NULL);
19924 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19925 }
19926}
19927
Tobin Ehlis8893af82017-05-08 12:52:25 -060019928TEST_F(VkPositiveLayerTest, ImmutableSamplerOnlyDescriptor) {
19929 TEST_DESCRIPTION(
19930 "Bind a DescriptorSet with only an immutable sampler"
19931 "and make sure that we don't warn for no update.");
19932
19933 ASSERT_NO_FATAL_FAILURE(Init());
19934 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19935
19936 VkDescriptorPoolSize ds_type_count = {};
19937 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
19938 ds_type_count.descriptorCount = 1;
19939
19940 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19941 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19942 ds_pool_ci.maxSets = 1;
19943 ds_pool_ci.poolSizeCount = 1;
19944 ds_pool_ci.pPoolSizes = &ds_type_count;
19945
19946 VkDescriptorPool ds_pool;
19947 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19948 ASSERT_VK_SUCCESS(err);
19949
19950 VkSamplerCreateInfo sampler_ci = {};
19951 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
19952 sampler_ci.pNext = NULL;
19953 sampler_ci.magFilter = VK_FILTER_NEAREST;
19954 sampler_ci.minFilter = VK_FILTER_NEAREST;
19955 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
19956 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19957 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19958 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19959 sampler_ci.mipLodBias = 1.0;
19960 sampler_ci.anisotropyEnable = VK_FALSE;
19961 sampler_ci.maxAnisotropy = 1;
19962 sampler_ci.compareEnable = VK_FALSE;
19963 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
19964 sampler_ci.minLod = 1.0;
19965 sampler_ci.maxLod = 1.0;
19966 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
19967 sampler_ci.unnormalizedCoordinates = VK_FALSE;
19968 VkSampler sampler;
19969
19970 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
19971 ASSERT_VK_SUCCESS(err);
19972
19973 VkDescriptorSetLayoutBinding layout_binding = {};
19974 layout_binding.binding = 0;
19975 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
19976 layout_binding.descriptorCount = 1;
19977 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19978 layout_binding.pImmutableSamplers = static_cast<VkSampler *>(&sampler);
19979
19980 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19981 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19982 ds_layout_ci.bindingCount = 1;
19983 ds_layout_ci.pBindings = &layout_binding;
19984 VkDescriptorSetLayout ds_layout;
19985 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19986 ASSERT_VK_SUCCESS(err);
19987
19988 VkDescriptorSetAllocateInfo alloc_info = {};
19989 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19990 alloc_info.descriptorSetCount = 1;
19991 alloc_info.descriptorPool = ds_pool;
19992 alloc_info.pSetLayouts = &ds_layout;
19993 VkDescriptorSet descriptor_set;
19994 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19995 ASSERT_VK_SUCCESS(err);
19996
19997 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19998 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19999 pipeline_layout_ci.pNext = NULL;
20000 pipeline_layout_ci.setLayoutCount = 1;
20001 pipeline_layout_ci.pSetLayouts = &ds_layout;
20002
20003 VkPipelineLayout pipeline_layout;
20004 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20005 ASSERT_VK_SUCCESS(err);
20006
20007 m_errorMonitor->ExpectSuccess();
20008 m_commandBuffer->BeginCommandBuffer();
20009 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
20010
20011 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
20012 &descriptor_set, 0, nullptr);
20013 m_errorMonitor->VerifyNotFound();
20014
20015 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20016 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20017 vkDestroySampler(m_device->device(), sampler, NULL);
20018 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20019}
20020
Tobin Ehlisf7428442016-10-25 07:58:24 -060020021TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
20022 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
20023
Tony Barbour1fa09702017-03-16 12:09:08 -060020024 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060020025 // Create layout where two binding #s are "1"
20026 static const uint32_t NUM_BINDINGS = 3;
20027 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
20028 dsl_binding[0].binding = 1;
20029 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20030 dsl_binding[0].descriptorCount = 1;
20031 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20032 dsl_binding[0].pImmutableSamplers = NULL;
20033 dsl_binding[1].binding = 0;
20034 dsl_binding[1].descriptorCount = 1;
20035 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20036 dsl_binding[1].descriptorCount = 1;
20037 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20038 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020039 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060020040 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20041 dsl_binding[2].descriptorCount = 1;
20042 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20043 dsl_binding[2].pImmutableSamplers = NULL;
20044
20045 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20046 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20047 ds_layout_ci.pNext = NULL;
20048 ds_layout_ci.bindingCount = NUM_BINDINGS;
20049 ds_layout_ci.pBindings = dsl_binding;
20050 VkDescriptorSetLayout ds_layout;
20051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
20052 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20053 m_errorMonitor->VerifyFound();
20054}
20055
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060020056TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020057 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
20058
Tony Barbour1fa09702017-03-16 12:09:08 -060020059 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020060
Tony Barbour552f6c02016-12-21 14:34:07 -070020061 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020062
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060020063 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
20064
20065 {
20066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
20067 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
20068 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20069 m_errorMonitor->VerifyFound();
20070 }
20071
20072 {
20073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
20074 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
20075 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20076 m_errorMonitor->VerifyFound();
20077 }
20078
20079 {
20080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
20081 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
20082 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20083 m_errorMonitor->VerifyFound();
20084 }
20085
20086 {
20087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
20088 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
20089 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20090 m_errorMonitor->VerifyFound();
20091 }
20092
20093 {
20094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
20095 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
20096 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20097 m_errorMonitor->VerifyFound();
20098 }
20099
20100 {
20101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
20102 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
20103 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20104 m_errorMonitor->VerifyFound();
20105 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020106
20107 {
20108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
20109 VkRect2D scissor = {{-1, 0}, {16, 16}};
20110 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20111 m_errorMonitor->VerifyFound();
20112 }
20113
20114 {
20115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
20116 VkRect2D scissor = {{0, -2}, {16, 16}};
20117 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20118 m_errorMonitor->VerifyFound();
20119 }
20120
20121 {
20122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
20123 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
20124 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20125 m_errorMonitor->VerifyFound();
20126 }
20127
20128 {
20129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
20130 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
20131 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20132 m_errorMonitor->VerifyFound();
20133 }
20134
Tony Barbour552f6c02016-12-21 14:34:07 -070020135 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020136}
20137
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020138// This is a positive test. No failures are expected.
20139TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
20140 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
20141 VkResult err;
20142
Tony Barbour1fa09702017-03-16 12:09:08 -060020143 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020144 m_errorMonitor->ExpectSuccess();
20145 VkDescriptorPoolSize ds_type_count = {};
20146 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20147 ds_type_count.descriptorCount = 2;
20148
20149 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20150 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20151 ds_pool_ci.pNext = NULL;
20152 ds_pool_ci.maxSets = 1;
20153 ds_pool_ci.poolSizeCount = 1;
20154 ds_pool_ci.pPoolSizes = &ds_type_count;
20155
20156 VkDescriptorPool ds_pool;
20157 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20158 ASSERT_VK_SUCCESS(err);
20159
20160 // Create layout with two uniform buffer descriptors w/ empty binding between them
20161 static const uint32_t NUM_BINDINGS = 3;
20162 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
20163 dsl_binding[0].binding = 0;
20164 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20165 dsl_binding[0].descriptorCount = 1;
20166 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
20167 dsl_binding[0].pImmutableSamplers = NULL;
20168 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020169 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020170 dsl_binding[2].binding = 2;
20171 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20172 dsl_binding[2].descriptorCount = 1;
20173 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
20174 dsl_binding[2].pImmutableSamplers = NULL;
20175
20176 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20177 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20178 ds_layout_ci.pNext = NULL;
20179 ds_layout_ci.bindingCount = NUM_BINDINGS;
20180 ds_layout_ci.pBindings = dsl_binding;
20181 VkDescriptorSetLayout ds_layout;
20182 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20183 ASSERT_VK_SUCCESS(err);
20184
20185 VkDescriptorSet descriptor_set = {};
20186 VkDescriptorSetAllocateInfo alloc_info = {};
20187 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20188 alloc_info.descriptorSetCount = 1;
20189 alloc_info.descriptorPool = ds_pool;
20190 alloc_info.pSetLayouts = &ds_layout;
20191 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20192 ASSERT_VK_SUCCESS(err);
20193
20194 // Create a buffer to be used for update
20195 VkBufferCreateInfo buff_ci = {};
20196 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20197 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20198 buff_ci.size = 256;
20199 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20200 VkBuffer buffer;
20201 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
20202 ASSERT_VK_SUCCESS(err);
20203 // Have to bind memory to buffer before descriptor update
20204 VkMemoryAllocateInfo mem_alloc = {};
20205 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20206 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020207 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020208 mem_alloc.memoryTypeIndex = 0;
20209
20210 VkMemoryRequirements mem_reqs;
20211 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20212 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
20213 if (!pass) {
20214 vkDestroyBuffer(m_device->device(), buffer, NULL);
20215 return;
20216 }
20217
20218 VkDeviceMemory mem;
20219 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20220 ASSERT_VK_SUCCESS(err);
20221 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20222 ASSERT_VK_SUCCESS(err);
20223
20224 // Only update the descriptor at binding 2
20225 VkDescriptorBufferInfo buff_info = {};
20226 buff_info.buffer = buffer;
20227 buff_info.offset = 0;
20228 buff_info.range = VK_WHOLE_SIZE;
20229 VkWriteDescriptorSet descriptor_write = {};
20230 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20231 descriptor_write.dstBinding = 2;
20232 descriptor_write.descriptorCount = 1;
20233 descriptor_write.pTexelBufferView = nullptr;
20234 descriptor_write.pBufferInfo = &buff_info;
20235 descriptor_write.pImageInfo = nullptr;
20236 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20237 descriptor_write.dstSet = descriptor_set;
20238
20239 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20240
20241 m_errorMonitor->VerifyNotFound();
20242 // Cleanup
20243 vkFreeMemory(m_device->device(), mem, NULL);
20244 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20245 vkDestroyBuffer(m_device->device(), buffer, NULL);
20246 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20247}
20248
20249// This is a positive test. No failures are expected.
20250TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
20251 VkResult err;
20252 bool pass;
20253
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020254 TEST_DESCRIPTION(
20255 "Create a buffer, allocate memory, bind memory, destroy "
20256 "the buffer, create an image, and bind the same memory to "
20257 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020258
20259 m_errorMonitor->ExpectSuccess();
20260
Tony Barbour1fa09702017-03-16 12:09:08 -060020261 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020262
20263 VkBuffer buffer;
20264 VkImage image;
20265 VkDeviceMemory mem;
20266 VkMemoryRequirements mem_reqs;
20267
20268 VkBufferCreateInfo buf_info = {};
20269 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20270 buf_info.pNext = NULL;
20271 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20272 buf_info.size = 256;
20273 buf_info.queueFamilyIndexCount = 0;
20274 buf_info.pQueueFamilyIndices = NULL;
20275 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20276 buf_info.flags = 0;
20277 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
20278 ASSERT_VK_SUCCESS(err);
20279
20280 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20281
20282 VkMemoryAllocateInfo alloc_info = {};
20283 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20284 alloc_info.pNext = NULL;
20285 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020286
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020287 // Ensure memory is big enough for both bindings
20288 alloc_info.allocationSize = 0x10000;
20289
20290 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20291 if (!pass) {
20292 vkDestroyBuffer(m_device->device(), buffer, NULL);
20293 return;
20294 }
20295
20296 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
20297 ASSERT_VK_SUCCESS(err);
20298
20299 uint8_t *pData;
20300 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
20301 ASSERT_VK_SUCCESS(err);
20302
20303 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
20304
20305 vkUnmapMemory(m_device->device(), mem);
20306
20307 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20308 ASSERT_VK_SUCCESS(err);
20309
20310 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
20311 // memory. In fact, it was never used by the GPU.
20312 // Just be be sure, wait for idle.
20313 vkDestroyBuffer(m_device->device(), buffer, NULL);
20314 vkDeviceWaitIdle(m_device->device());
20315
Tobin Ehlis6a005702016-12-28 15:25:56 -070020316 // Use optimal as some platforms report linear support but then fail image creation
20317 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
20318 VkImageFormatProperties image_format_properties;
20319 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
20320 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
20321 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070020322 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070020323 vkFreeMemory(m_device->device(), mem, NULL);
20324 return;
20325 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020326 VkImageCreateInfo image_create_info = {};
20327 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20328 image_create_info.pNext = NULL;
20329 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20330 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
20331 image_create_info.extent.width = 64;
20332 image_create_info.extent.height = 64;
20333 image_create_info.extent.depth = 1;
20334 image_create_info.mipLevels = 1;
20335 image_create_info.arrayLayers = 1;
20336 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070020337 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020338 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
20339 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
20340 image_create_info.queueFamilyIndexCount = 0;
20341 image_create_info.pQueueFamilyIndices = NULL;
20342 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20343 image_create_info.flags = 0;
20344
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020345 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020346 * to be textures or it will be the staging image if they are not.
20347 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020348 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20349 ASSERT_VK_SUCCESS(err);
20350
20351 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
20352
Tobin Ehlis6a005702016-12-28 15:25:56 -070020353 VkMemoryAllocateInfo mem_alloc = {};
20354 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20355 mem_alloc.pNext = NULL;
20356 mem_alloc.allocationSize = 0;
20357 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020358 mem_alloc.allocationSize = mem_reqs.size;
20359
20360 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20361 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070020362 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020363 vkDestroyImage(m_device->device(), image, NULL);
20364 return;
20365 }
20366
20367 // VALIDATION FAILURE:
20368 err = vkBindImageMemory(m_device->device(), image, mem, 0);
20369 ASSERT_VK_SUCCESS(err);
20370
20371 m_errorMonitor->VerifyNotFound();
20372
20373 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020374 vkDestroyImage(m_device->device(), image, NULL);
20375}
20376
Tony Barbourab713912017-02-02 14:17:35 -070020377// This is a positive test. No failures are expected.
20378TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
20379 VkResult err;
20380
20381 TEST_DESCRIPTION(
20382 "Call all applicable destroy and free routines with NULL"
20383 "handles, expecting no validation errors");
20384
20385 m_errorMonitor->ExpectSuccess();
20386
Tony Barbour1fa09702017-03-16 12:09:08 -060020387 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070020388 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20389 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
20390 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
20391 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
20392 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20393 vkDestroyDevice(VK_NULL_HANDLE, NULL);
20394 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
20395 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
20396 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20397 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
20398 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
20399 vkDestroyInstance(VK_NULL_HANDLE, NULL);
20400 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
20401 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
20402 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20403 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
20404 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
20405 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
20406 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
20407 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
20408
20409 VkCommandPool command_pool;
20410 VkCommandPoolCreateInfo pool_create_info{};
20411 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20412 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20413 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20414 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20415 VkCommandBuffer command_buffers[3] = {};
20416 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20417 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20418 command_buffer_allocate_info.commandPool = command_pool;
20419 command_buffer_allocate_info.commandBufferCount = 1;
20420 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20421 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
20422 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
20423 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20424
20425 VkDescriptorPoolSize ds_type_count = {};
20426 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20427 ds_type_count.descriptorCount = 1;
20428
20429 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20430 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20431 ds_pool_ci.pNext = NULL;
20432 ds_pool_ci.maxSets = 1;
20433 ds_pool_ci.poolSizeCount = 1;
20434 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
20435 ds_pool_ci.pPoolSizes = &ds_type_count;
20436
20437 VkDescriptorPool ds_pool;
20438 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20439 ASSERT_VK_SUCCESS(err);
20440
20441 VkDescriptorSetLayoutBinding dsl_binding = {};
20442 dsl_binding.binding = 2;
20443 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20444 dsl_binding.descriptorCount = 1;
20445 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20446 dsl_binding.pImmutableSamplers = NULL;
20447 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20448 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20449 ds_layout_ci.pNext = NULL;
20450 ds_layout_ci.bindingCount = 1;
20451 ds_layout_ci.pBindings = &dsl_binding;
20452 VkDescriptorSetLayout ds_layout;
20453 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20454 ASSERT_VK_SUCCESS(err);
20455
20456 VkDescriptorSet descriptor_sets[3] = {};
20457 VkDescriptorSetAllocateInfo alloc_info = {};
20458 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20459 alloc_info.descriptorSetCount = 1;
20460 alloc_info.descriptorPool = ds_pool;
20461 alloc_info.pSetLayouts = &ds_layout;
20462 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
20463 ASSERT_VK_SUCCESS(err);
20464 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
20465 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20466 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20467
20468 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
20469
20470 m_errorMonitor->VerifyNotFound();
20471}
20472
Tony Barbour626994c2017-02-08 15:29:37 -070020473TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070020474 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070020475
20476 m_errorMonitor->ExpectSuccess();
20477
Tony Barbour1fa09702017-03-16 12:09:08 -060020478 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070020479 VkCommandBuffer cmd_bufs[4];
20480 VkCommandBufferAllocateInfo alloc_info;
20481 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20482 alloc_info.pNext = NULL;
20483 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070020484 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070020485 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20486 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
20487 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020488 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070020489 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
20490 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070020491 ASSERT_TRUE(image.initialized());
20492 VkCommandBufferBeginInfo cb_binfo;
20493 cb_binfo.pNext = NULL;
20494 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20495 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
20496 cb_binfo.flags = 0;
20497 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
20498 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
20499 VkImageMemoryBarrier img_barrier = {};
20500 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20501 img_barrier.pNext = NULL;
20502 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20503 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20504 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20505 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20506 img_barrier.image = image.handle();
20507 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20508 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20509 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20510 img_barrier.subresourceRange.baseArrayLayer = 0;
20511 img_barrier.subresourceRange.baseMipLevel = 0;
20512 img_barrier.subresourceRange.layerCount = 1;
20513 img_barrier.subresourceRange.levelCount = 1;
20514 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20515 &img_barrier);
20516 vkEndCommandBuffer(cmd_bufs[0]);
20517 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
20518 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20519 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20520 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20521 &img_barrier);
20522 vkEndCommandBuffer(cmd_bufs[1]);
20523 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
20524 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20525 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20526 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20527 &img_barrier);
20528 vkEndCommandBuffer(cmd_bufs[2]);
20529 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
20530 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20531 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20532 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20533 &img_barrier);
20534 vkEndCommandBuffer(cmd_bufs[3]);
20535
20536 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
20537 VkSemaphore semaphore1, semaphore2;
20538 VkSemaphoreCreateInfo semaphore_create_info{};
20539 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20540 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
20541 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
20542 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
20543 VkSubmitInfo submit_info[3];
20544 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20545 submit_info[0].pNext = nullptr;
20546 submit_info[0].commandBufferCount = 1;
20547 submit_info[0].pCommandBuffers = &cmd_bufs[0];
20548 submit_info[0].signalSemaphoreCount = 1;
20549 submit_info[0].pSignalSemaphores = &semaphore1;
20550 submit_info[0].waitSemaphoreCount = 0;
20551 submit_info[0].pWaitDstStageMask = nullptr;
20552 submit_info[0].pWaitDstStageMask = flags;
20553 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20554 submit_info[1].pNext = nullptr;
20555 submit_info[1].commandBufferCount = 1;
20556 submit_info[1].pCommandBuffers = &cmd_bufs[1];
20557 submit_info[1].waitSemaphoreCount = 1;
20558 submit_info[1].pWaitSemaphores = &semaphore1;
20559 submit_info[1].signalSemaphoreCount = 1;
20560 submit_info[1].pSignalSemaphores = &semaphore2;
20561 submit_info[1].pWaitDstStageMask = flags;
20562 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20563 submit_info[2].pNext = nullptr;
20564 submit_info[2].commandBufferCount = 2;
20565 submit_info[2].pCommandBuffers = &cmd_bufs[2];
20566 submit_info[2].waitSemaphoreCount = 1;
20567 submit_info[2].pWaitSemaphores = &semaphore2;
20568 submit_info[2].signalSemaphoreCount = 0;
20569 submit_info[2].pSignalSemaphores = nullptr;
20570 submit_info[2].pWaitDstStageMask = flags;
20571 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
20572 vkQueueWaitIdle(m_device->m_queue);
20573
20574 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
20575 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
20576 m_errorMonitor->VerifyNotFound();
20577}
20578
Tobin Ehlis953e8392016-11-17 10:54:13 -070020579TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
20580 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
20581 // We previously had a bug where dynamic offset of inactive bindings was still being used
20582 VkResult err;
20583 m_errorMonitor->ExpectSuccess();
20584
Tony Barbour1fa09702017-03-16 12:09:08 -060020585 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070020586 ASSERT_NO_FATAL_FAILURE(InitViewport());
20587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20588
20589 VkDescriptorPoolSize ds_type_count = {};
20590 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20591 ds_type_count.descriptorCount = 3;
20592
20593 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20594 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20595 ds_pool_ci.pNext = NULL;
20596 ds_pool_ci.maxSets = 1;
20597 ds_pool_ci.poolSizeCount = 1;
20598 ds_pool_ci.pPoolSizes = &ds_type_count;
20599
20600 VkDescriptorPool ds_pool;
20601 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20602 ASSERT_VK_SUCCESS(err);
20603
20604 const uint32_t BINDING_COUNT = 3;
20605 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020606 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020607 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20608 dsl_binding[0].descriptorCount = 1;
20609 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20610 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020611 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020612 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20613 dsl_binding[1].descriptorCount = 1;
20614 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20615 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020616 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020617 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20618 dsl_binding[2].descriptorCount = 1;
20619 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20620 dsl_binding[2].pImmutableSamplers = NULL;
20621
20622 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20623 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20624 ds_layout_ci.pNext = NULL;
20625 ds_layout_ci.bindingCount = BINDING_COUNT;
20626 ds_layout_ci.pBindings = dsl_binding;
20627 VkDescriptorSetLayout ds_layout;
20628 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20629 ASSERT_VK_SUCCESS(err);
20630
20631 VkDescriptorSet descriptor_set;
20632 VkDescriptorSetAllocateInfo alloc_info = {};
20633 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20634 alloc_info.descriptorSetCount = 1;
20635 alloc_info.descriptorPool = ds_pool;
20636 alloc_info.pSetLayouts = &ds_layout;
20637 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20638 ASSERT_VK_SUCCESS(err);
20639
20640 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20641 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20642 pipeline_layout_ci.pNext = NULL;
20643 pipeline_layout_ci.setLayoutCount = 1;
20644 pipeline_layout_ci.pSetLayouts = &ds_layout;
20645
20646 VkPipelineLayout pipeline_layout;
20647 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20648 ASSERT_VK_SUCCESS(err);
20649
20650 // Create two buffers to update the descriptors with
20651 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
20652 uint32_t qfi = 0;
20653 VkBufferCreateInfo buffCI = {};
20654 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20655 buffCI.size = 2048;
20656 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20657 buffCI.queueFamilyIndexCount = 1;
20658 buffCI.pQueueFamilyIndices = &qfi;
20659
20660 VkBuffer dyub1;
20661 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
20662 ASSERT_VK_SUCCESS(err);
20663 // buffer2
20664 buffCI.size = 1024;
20665 VkBuffer dyub2;
20666 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
20667 ASSERT_VK_SUCCESS(err);
20668 // Allocate memory and bind to buffers
20669 VkMemoryAllocateInfo mem_alloc[2] = {};
20670 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20671 mem_alloc[0].pNext = NULL;
20672 mem_alloc[0].memoryTypeIndex = 0;
20673 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20674 mem_alloc[1].pNext = NULL;
20675 mem_alloc[1].memoryTypeIndex = 0;
20676
20677 VkMemoryRequirements mem_reqs1;
20678 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
20679 VkMemoryRequirements mem_reqs2;
20680 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
20681 mem_alloc[0].allocationSize = mem_reqs1.size;
20682 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
20683 mem_alloc[1].allocationSize = mem_reqs2.size;
20684 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
20685 if (!pass) {
20686 vkDestroyBuffer(m_device->device(), dyub1, NULL);
20687 vkDestroyBuffer(m_device->device(), dyub2, NULL);
20688 return;
20689 }
20690
20691 VkDeviceMemory mem1;
20692 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
20693 ASSERT_VK_SUCCESS(err);
20694 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
20695 ASSERT_VK_SUCCESS(err);
20696 VkDeviceMemory mem2;
20697 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
20698 ASSERT_VK_SUCCESS(err);
20699 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
20700 ASSERT_VK_SUCCESS(err);
20701 // Update descriptors
20702 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
20703 buff_info[0].buffer = dyub1;
20704 buff_info[0].offset = 0;
20705 buff_info[0].range = 256;
20706 buff_info[1].buffer = dyub1;
20707 buff_info[1].offset = 256;
20708 buff_info[1].range = 512;
20709 buff_info[2].buffer = dyub2;
20710 buff_info[2].offset = 0;
20711 buff_info[2].range = 512;
20712
20713 VkWriteDescriptorSet descriptor_write;
20714 memset(&descriptor_write, 0, sizeof(descriptor_write));
20715 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20716 descriptor_write.dstSet = descriptor_set;
20717 descriptor_write.dstBinding = 0;
20718 descriptor_write.descriptorCount = BINDING_COUNT;
20719 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20720 descriptor_write.pBufferInfo = buff_info;
20721
20722 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20723
Tony Barbour552f6c02016-12-21 14:34:07 -070020724 m_commandBuffer->BeginCommandBuffer();
20725 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070020726
20727 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020728 char const *vsSource =
20729 "#version 450\n"
20730 "\n"
20731 "out gl_PerVertex { \n"
20732 " vec4 gl_Position;\n"
20733 "};\n"
20734 "void main(){\n"
20735 " gl_Position = vec4(1);\n"
20736 "}\n";
20737 char const *fsSource =
20738 "#version 450\n"
20739 "\n"
20740 "layout(location=0) out vec4 x;\n"
20741 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
20742 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
20743 "void main(){\n"
20744 " x = vec4(bar1.y) + vec4(bar2.y);\n"
20745 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070020746 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20747 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20748 VkPipelineObj pipe(m_device);
20749 pipe.SetViewport(m_viewports);
20750 pipe.SetScissor(m_scissors);
20751 pipe.AddShader(&vs);
20752 pipe.AddShader(&fs);
20753 pipe.AddColorAttachment();
20754 pipe.CreateVKPipeline(pipeline_layout, renderPass());
20755
20756 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
20757 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
20758 // we used to have a bug in this case.
20759 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
20760 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
20761 &descriptor_set, BINDING_COUNT, dyn_off);
20762 Draw(1, 0, 0, 0);
20763 m_errorMonitor->VerifyNotFound();
20764
20765 vkDestroyBuffer(m_device->device(), dyub1, NULL);
20766 vkDestroyBuffer(m_device->device(), dyub2, NULL);
20767 vkFreeMemory(m_device->device(), mem1, NULL);
20768 vkFreeMemory(m_device->device(), mem2, NULL);
20769
20770 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20771 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20772 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20773}
20774
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020775TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020776 TEST_DESCRIPTION(
20777 "Ensure that validations handling of non-coherent memory "
20778 "mapping while using VK_WHOLE_SIZE does not cause access "
20779 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020780 VkResult err;
20781 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060020782 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020783
20784 VkDeviceMemory mem;
20785 VkMemoryRequirements mem_reqs;
20786 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020787 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020788 VkMemoryAllocateInfo alloc_info = {};
20789 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20790 alloc_info.pNext = NULL;
20791 alloc_info.memoryTypeIndex = 0;
20792
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020793 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020794 alloc_info.allocationSize = allocation_size;
20795
20796 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
20797 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 -070020798 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020799 if (!pass) {
20800 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020801 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
20802 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020803 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020804 pass = m_device->phy().set_memory_type(
20805 mem_reqs.memoryTypeBits, &alloc_info,
20806 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
20807 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020808 if (!pass) {
20809 return;
20810 }
20811 }
20812 }
20813
20814 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
20815 ASSERT_VK_SUCCESS(err);
20816
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020817 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020818 m_errorMonitor->ExpectSuccess();
20819 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
20820 ASSERT_VK_SUCCESS(err);
20821 VkMappedMemoryRange mmr = {};
20822 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20823 mmr.memory = mem;
20824 mmr.offset = 0;
20825 mmr.size = VK_WHOLE_SIZE;
20826 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20827 ASSERT_VK_SUCCESS(err);
20828 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20829 ASSERT_VK_SUCCESS(err);
20830 m_errorMonitor->VerifyNotFound();
20831 vkUnmapMemory(m_device->device(), mem);
20832
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020833 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020834 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020835 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020836 ASSERT_VK_SUCCESS(err);
20837 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20838 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020839 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020840 mmr.size = VK_WHOLE_SIZE;
20841 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20842 ASSERT_VK_SUCCESS(err);
20843 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20844 ASSERT_VK_SUCCESS(err);
20845 m_errorMonitor->VerifyNotFound();
20846 vkUnmapMemory(m_device->device(), mem);
20847
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020848 // Map with offset and size
20849 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020850 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020851 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020852 ASSERT_VK_SUCCESS(err);
20853 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20854 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020855 mmr.offset = 4 * atom_size;
20856 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020857 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20858 ASSERT_VK_SUCCESS(err);
20859 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20860 ASSERT_VK_SUCCESS(err);
20861 m_errorMonitor->VerifyNotFound();
20862 vkUnmapMemory(m_device->device(), mem);
20863
20864 // Map without offset and flush WHOLE_SIZE with two separate offsets
20865 m_errorMonitor->ExpectSuccess();
20866 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
20867 ASSERT_VK_SUCCESS(err);
20868 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20869 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020870 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020871 mmr.size = VK_WHOLE_SIZE;
20872 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20873 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020874 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020875 mmr.size = VK_WHOLE_SIZE;
20876 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20877 ASSERT_VK_SUCCESS(err);
20878 m_errorMonitor->VerifyNotFound();
20879 vkUnmapMemory(m_device->device(), mem);
20880
20881 vkFreeMemory(m_device->device(), mem, NULL);
20882}
20883
20884// This is a positive test. We used to expect error in this case but spec now allows it
20885TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
20886 m_errorMonitor->ExpectSuccess();
20887 vk_testing::Fence testFence;
20888 VkFenceCreateInfo fenceInfo = {};
20889 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20890 fenceInfo.pNext = NULL;
20891
Tony Barbour1fa09702017-03-16 12:09:08 -060020892 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020893 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020894 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020895 VkResult result = vkResetFences(m_device->device(), 1, fences);
20896 ASSERT_VK_SUCCESS(result);
20897
20898 m_errorMonitor->VerifyNotFound();
20899}
20900
20901TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
20902 m_errorMonitor->ExpectSuccess();
20903
Tony Barbour1fa09702017-03-16 12:09:08 -060020904 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020905 VkResult err;
20906
20907 // Record (empty!) command buffer that can be submitted multiple times
20908 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020909 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
20910 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020911 m_commandBuffer->BeginCommandBuffer(&cbbi);
20912 m_commandBuffer->EndCommandBuffer();
20913
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020914 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020915 VkFence fence;
20916 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
20917 ASSERT_VK_SUCCESS(err);
20918
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020919 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020920 VkSemaphore s1, s2;
20921 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
20922 ASSERT_VK_SUCCESS(err);
20923 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
20924 ASSERT_VK_SUCCESS(err);
20925
20926 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020927 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020928 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
20929 ASSERT_VK_SUCCESS(err);
20930
20931 // Submit CB again, signaling s2.
20932 si.pSignalSemaphores = &s2;
20933 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
20934 ASSERT_VK_SUCCESS(err);
20935
20936 // Wait for fence.
20937 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20938 ASSERT_VK_SUCCESS(err);
20939
20940 // CB is still in flight from second submission, but semaphore s1 is no
20941 // longer in flight. delete it.
20942 vkDestroySemaphore(m_device->device(), s1, nullptr);
20943
20944 m_errorMonitor->VerifyNotFound();
20945
20946 // Force device idle and clean up remaining objects
20947 vkDeviceWaitIdle(m_device->device());
20948 vkDestroySemaphore(m_device->device(), s2, nullptr);
20949 vkDestroyFence(m_device->device(), fence, nullptr);
20950}
20951
20952TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
20953 m_errorMonitor->ExpectSuccess();
20954
Tony Barbour1fa09702017-03-16 12:09:08 -060020955 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020956 VkResult err;
20957
20958 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020959 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020960 VkFence f1;
20961 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20962 ASSERT_VK_SUCCESS(err);
20963
20964 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020965 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020966 VkFence f2;
20967 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20968 ASSERT_VK_SUCCESS(err);
20969
20970 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020971 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020972 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20973
20974 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020975 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020976 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20977
20978 // Should have both retired!
20979 vkDestroyFence(m_device->device(), f1, nullptr);
20980 vkDestroyFence(m_device->device(), f2, nullptr);
20981
20982 m_errorMonitor->VerifyNotFound();
20983}
20984
20985TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020986 TEST_DESCRIPTION(
20987 "Verify that creating an image view from an image with valid usage "
20988 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020989
Tony Barbour1fa09702017-03-16 12:09:08 -060020990 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020991
20992 m_errorMonitor->ExpectSuccess();
20993 // Verify that we can create a view with usage INPUT_ATTACHMENT
20994 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020995 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 -060020996 ASSERT_TRUE(image.initialized());
20997 VkImageView imageView;
20998 VkImageViewCreateInfo ivci = {};
20999 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
21000 ivci.image = image.handle();
21001 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
21002 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
21003 ivci.subresourceRange.layerCount = 1;
21004 ivci.subresourceRange.baseMipLevel = 0;
21005 ivci.subresourceRange.levelCount = 1;
21006 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
21007
21008 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
21009 m_errorMonitor->VerifyNotFound();
21010 vkDestroyImageView(m_device->device(), imageView, NULL);
21011}
21012
21013// This is a positive test. No failures are expected.
21014TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021015 TEST_DESCRIPTION(
21016 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
21017 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021018
Tony Barbour1fa09702017-03-16 12:09:08 -060021019 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021020
21021 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021022 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060021023 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021024
21025 m_errorMonitor->ExpectSuccess();
21026
21027 VkImage image;
21028 VkImageCreateInfo image_create_info = {};
21029 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
21030 image_create_info.pNext = NULL;
21031 image_create_info.imageType = VK_IMAGE_TYPE_2D;
21032 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
21033 image_create_info.extent.width = 64;
21034 image_create_info.extent.height = 64;
21035 image_create_info.extent.depth = 1;
21036 image_create_info.mipLevels = 1;
21037 image_create_info.arrayLayers = 1;
21038 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
21039 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
21040 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
21041 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
21042 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
21043 ASSERT_VK_SUCCESS(err);
21044
21045 VkMemoryRequirements memory_reqs;
21046 VkDeviceMemory memory_one, memory_two;
21047 bool pass;
21048 VkMemoryAllocateInfo memory_info = {};
21049 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21050 memory_info.pNext = NULL;
21051 memory_info.allocationSize = 0;
21052 memory_info.memoryTypeIndex = 0;
21053 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
21054 // Find an image big enough to allow sparse mapping of 2 memory regions
21055 // Increase the image size until it is at least twice the
21056 // size of the required alignment, to ensure we can bind both
21057 // allocated memory blocks to the image on aligned offsets.
21058 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
21059 vkDestroyImage(m_device->device(), image, nullptr);
21060 image_create_info.extent.width *= 2;
21061 image_create_info.extent.height *= 2;
21062 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
21063 ASSERT_VK_SUCCESS(err);
21064 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
21065 }
21066 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
21067 // at the end of the first
21068 memory_info.allocationSize = memory_reqs.alignment;
21069 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
21070 ASSERT_TRUE(pass);
21071 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
21072 ASSERT_VK_SUCCESS(err);
21073 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
21074 ASSERT_VK_SUCCESS(err);
21075 VkSparseMemoryBind binds[2];
21076 binds[0].flags = 0;
21077 binds[0].memory = memory_one;
21078 binds[0].memoryOffset = 0;
21079 binds[0].resourceOffset = 0;
21080 binds[0].size = memory_info.allocationSize;
21081 binds[1].flags = 0;
21082 binds[1].memory = memory_two;
21083 binds[1].memoryOffset = 0;
21084 binds[1].resourceOffset = memory_info.allocationSize;
21085 binds[1].size = memory_info.allocationSize;
21086
21087 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
21088 opaqueBindInfo.image = image;
21089 opaqueBindInfo.bindCount = 2;
21090 opaqueBindInfo.pBinds = binds;
21091
21092 VkFence fence = VK_NULL_HANDLE;
21093 VkBindSparseInfo bindSparseInfo = {};
21094 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
21095 bindSparseInfo.imageOpaqueBindCount = 1;
21096 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
21097
21098 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
21099 vkQueueWaitIdle(m_device->m_queue);
21100 vkDestroyImage(m_device->device(), image, NULL);
21101 vkFreeMemory(m_device->device(), memory_one, NULL);
21102 vkFreeMemory(m_device->device(), memory_two, NULL);
21103 m_errorMonitor->VerifyNotFound();
21104}
21105
21106TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021107 TEST_DESCRIPTION(
21108 "Ensure that CmdBeginRenderPass with an attachment's "
21109 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
21110 "the command buffer has prior knowledge of that "
21111 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021112
21113 m_errorMonitor->ExpectSuccess();
21114
Tony Barbour1fa09702017-03-16 12:09:08 -060021115 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021116
21117 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021118 VkAttachmentDescription attachment = {0,
21119 VK_FORMAT_R8G8B8A8_UNORM,
21120 VK_SAMPLE_COUNT_1_BIT,
21121 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21122 VK_ATTACHMENT_STORE_OP_STORE,
21123 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21124 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21125 VK_IMAGE_LAYOUT_UNDEFINED,
21126 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021127
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021128 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021129
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021130 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021131
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021132 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021133
21134 VkRenderPass rp;
21135 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21136 ASSERT_VK_SUCCESS(err);
21137
21138 // A compatible framebuffer.
21139 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021140 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 -060021141 ASSERT_TRUE(image.initialized());
21142
21143 VkImageViewCreateInfo ivci = {
21144 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21145 nullptr,
21146 0,
21147 image.handle(),
21148 VK_IMAGE_VIEW_TYPE_2D,
21149 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021150 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21151 VK_COMPONENT_SWIZZLE_IDENTITY},
21152 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021153 };
21154 VkImageView view;
21155 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21156 ASSERT_VK_SUCCESS(err);
21157
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021158 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021159 VkFramebuffer fb;
21160 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21161 ASSERT_VK_SUCCESS(err);
21162
21163 // Record a single command buffer which uses this renderpass twice. The
21164 // bug is triggered at the beginning of the second renderpass, when the
21165 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021166 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 -070021167 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021168 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21169 vkCmdEndRenderPass(m_commandBuffer->handle());
21170 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21171
21172 m_errorMonitor->VerifyNotFound();
21173
21174 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070021175 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021176
21177 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21178 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21179 vkDestroyImageView(m_device->device(), view, nullptr);
21180}
21181
21182TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021183 TEST_DESCRIPTION(
21184 "This test should pass. Create a Framebuffer and "
21185 "command buffer, bind them together, then destroy "
21186 "command pool and framebuffer and verify there are no "
21187 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021188
21189 m_errorMonitor->ExpectSuccess();
21190
Tony Barbour1fa09702017-03-16 12:09:08 -060021191 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021192
21193 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021194 VkAttachmentDescription attachment = {0,
21195 VK_FORMAT_R8G8B8A8_UNORM,
21196 VK_SAMPLE_COUNT_1_BIT,
21197 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21198 VK_ATTACHMENT_STORE_OP_STORE,
21199 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21200 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21201 VK_IMAGE_LAYOUT_UNDEFINED,
21202 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021203
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021204 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021205
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021206 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021207
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021208 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021209
21210 VkRenderPass rp;
21211 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21212 ASSERT_VK_SUCCESS(err);
21213
21214 // A compatible framebuffer.
21215 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021216 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 -060021217 ASSERT_TRUE(image.initialized());
21218
21219 VkImageViewCreateInfo ivci = {
21220 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21221 nullptr,
21222 0,
21223 image.handle(),
21224 VK_IMAGE_VIEW_TYPE_2D,
21225 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021226 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21227 VK_COMPONENT_SWIZZLE_IDENTITY},
21228 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021229 };
21230 VkImageView view;
21231 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21232 ASSERT_VK_SUCCESS(err);
21233
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021234 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021235 VkFramebuffer fb;
21236 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21237 ASSERT_VK_SUCCESS(err);
21238
21239 // Explicitly create a command buffer to bind the FB to so that we can then
21240 // destroy the command pool in order to implicitly free command buffer
21241 VkCommandPool command_pool;
21242 VkCommandPoolCreateInfo pool_create_info{};
21243 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21244 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21245 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21246 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21247
21248 VkCommandBuffer command_buffer;
21249 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21250 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21251 command_buffer_allocate_info.commandPool = command_pool;
21252 command_buffer_allocate_info.commandBufferCount = 1;
21253 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21254 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21255
21256 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021257 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 -060021258 VkCommandBufferBeginInfo begin_info{};
21259 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21260 vkBeginCommandBuffer(command_buffer, &begin_info);
21261
21262 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21263 vkCmdEndRenderPass(command_buffer);
21264 vkEndCommandBuffer(command_buffer);
21265 vkDestroyImageView(m_device->device(), view, nullptr);
21266 // Destroy command pool to implicitly free command buffer
21267 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21268 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21269 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21270 m_errorMonitor->VerifyNotFound();
21271}
21272
21273TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021274 TEST_DESCRIPTION(
21275 "Ensure that CmdBeginRenderPass applies the layout "
21276 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021277
21278 m_errorMonitor->ExpectSuccess();
21279
Tony Barbour1fa09702017-03-16 12:09:08 -060021280 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021281
21282 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021283 VkAttachmentDescription attachment = {0,
21284 VK_FORMAT_R8G8B8A8_UNORM,
21285 VK_SAMPLE_COUNT_1_BIT,
21286 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21287 VK_ATTACHMENT_STORE_OP_STORE,
21288 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21289 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21290 VK_IMAGE_LAYOUT_UNDEFINED,
21291 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021292
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021293 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021294
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021295 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021296
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021297 VkSubpassDependency dep = {0,
21298 0,
21299 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21300 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21301 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21302 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21303 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021304
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021305 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021306
21307 VkResult err;
21308 VkRenderPass rp;
21309 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21310 ASSERT_VK_SUCCESS(err);
21311
21312 // A compatible framebuffer.
21313 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021314 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 -060021315 ASSERT_TRUE(image.initialized());
21316
21317 VkImageViewCreateInfo ivci = {
21318 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21319 nullptr,
21320 0,
21321 image.handle(),
21322 VK_IMAGE_VIEW_TYPE_2D,
21323 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021324 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21325 VK_COMPONENT_SWIZZLE_IDENTITY},
21326 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021327 };
21328 VkImageView view;
21329 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21330 ASSERT_VK_SUCCESS(err);
21331
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021332 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021333 VkFramebuffer fb;
21334 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21335 ASSERT_VK_SUCCESS(err);
21336
21337 // Record a single command buffer which issues a pipeline barrier w/
21338 // image memory barrier for the attachment. This detects the previously
21339 // missing tracking of the subpass layout by throwing a validation error
21340 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021341 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 -070021342 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021343 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21344
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021345 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
21346 nullptr,
21347 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21348 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21349 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21350 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21351 VK_QUEUE_FAMILY_IGNORED,
21352 VK_QUEUE_FAMILY_IGNORED,
21353 image.handle(),
21354 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021355 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021356 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21357 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021358
21359 vkCmdEndRenderPass(m_commandBuffer->handle());
21360 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021361 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021362
21363 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21364 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21365 vkDestroyImageView(m_device->device(), view, nullptr);
21366}
21367
21368TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021369 TEST_DESCRIPTION(
21370 "Validate that when an imageView of a depth/stencil image "
21371 "is used as a depth/stencil framebuffer attachment, the "
21372 "aspectMask is ignored and both depth and stencil image "
21373 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021374
Tony Barbour1fa09702017-03-16 12:09:08 -060021375 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021376 VkFormatProperties format_properties;
21377 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
21378 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
21379 return;
21380 }
21381
21382 m_errorMonitor->ExpectSuccess();
21383
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021384 VkAttachmentDescription attachment = {0,
21385 VK_FORMAT_D32_SFLOAT_S8_UINT,
21386 VK_SAMPLE_COUNT_1_BIT,
21387 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21388 VK_ATTACHMENT_STORE_OP_STORE,
21389 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21390 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21391 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
21392 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021393
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021394 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021395
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021396 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021397
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021398 VkSubpassDependency dep = {0,
21399 0,
21400 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21401 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21402 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21403 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21404 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021405
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021406 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021407
21408 VkResult err;
21409 VkRenderPass rp;
21410 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21411 ASSERT_VK_SUCCESS(err);
21412
21413 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021414 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
21415 0x26, // usage
21416 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021417 ASSERT_TRUE(image.initialized());
21418 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
21419
21420 VkImageViewCreateInfo ivci = {
21421 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21422 nullptr,
21423 0,
21424 image.handle(),
21425 VK_IMAGE_VIEW_TYPE_2D,
21426 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021427 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
21428 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021429 };
21430 VkImageView view;
21431 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21432 ASSERT_VK_SUCCESS(err);
21433
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021434 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021435 VkFramebuffer fb;
21436 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21437 ASSERT_VK_SUCCESS(err);
21438
Tony Barbour552f6c02016-12-21 14:34:07 -070021439 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021440
21441 VkImageMemoryBarrier imb = {};
21442 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21443 imb.pNext = nullptr;
21444 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21445 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
21446 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21447 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
21448 imb.srcQueueFamilyIndex = 0;
21449 imb.dstQueueFamilyIndex = 0;
21450 imb.image = image.handle();
21451 imb.subresourceRange.aspectMask = 0x6;
21452 imb.subresourceRange.baseMipLevel = 0;
21453 imb.subresourceRange.levelCount = 0x1;
21454 imb.subresourceRange.baseArrayLayer = 0;
21455 imb.subresourceRange.layerCount = 0x1;
21456
21457 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021458 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21459 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021460
Tony Barbour552f6c02016-12-21 14:34:07 -070021461 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021462 QueueCommandBuffer(false);
21463 m_errorMonitor->VerifyNotFound();
21464
21465 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21466 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21467 vkDestroyImageView(m_device->device(), view, nullptr);
21468}
21469
21470TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021471 TEST_DESCRIPTION(
21472 "Ensure that layout transitions work correctly without "
21473 "errors, when an attachment reference is "
21474 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021475
21476 m_errorMonitor->ExpectSuccess();
21477
Tony Barbour1fa09702017-03-16 12:09:08 -060021478 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021479
21480 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021481 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021482
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021483 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021484
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021485 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021486
21487 VkRenderPass rp;
21488 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21489 ASSERT_VK_SUCCESS(err);
21490
21491 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021492 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021493 VkFramebuffer fb;
21494 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21495 ASSERT_VK_SUCCESS(err);
21496
21497 // Record a command buffer which just begins and ends the renderpass. The
21498 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021499 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 -070021500 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021501 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21502 vkCmdEndRenderPass(m_commandBuffer->handle());
21503 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021504 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021505
21506 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21507 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21508}
21509
21510// This is a positive test. No errors are expected.
21511TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021512 TEST_DESCRIPTION(
21513 "Create a stencil-only attachment with a LOAD_OP set to "
21514 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021515 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060021516 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021517 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021518 if (!depth_format) {
21519 printf(" No Depth + Stencil format found. Skipped.\n");
21520 return;
21521 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021522 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070021523 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021524 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
21525 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021526 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
21527 return;
21528 }
21529
Tony Barbourf887b162017-03-09 10:06:46 -070021530 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021531 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021532 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021533 VkAttachmentDescription att = {};
21534 VkAttachmentReference ref = {};
21535 att.format = depth_stencil_fmt;
21536 att.samples = VK_SAMPLE_COUNT_1_BIT;
21537 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
21538 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21539 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21540 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
21541 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21542 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21543
21544 VkClearValue clear;
21545 clear.depthStencil.depth = 1.0;
21546 clear.depthStencil.stencil = 0;
21547 ref.attachment = 0;
21548 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21549
21550 VkSubpassDescription subpass = {};
21551 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
21552 subpass.flags = 0;
21553 subpass.inputAttachmentCount = 0;
21554 subpass.pInputAttachments = NULL;
21555 subpass.colorAttachmentCount = 0;
21556 subpass.pColorAttachments = NULL;
21557 subpass.pResolveAttachments = NULL;
21558 subpass.pDepthStencilAttachment = &ref;
21559 subpass.preserveAttachmentCount = 0;
21560 subpass.pPreserveAttachments = NULL;
21561
21562 VkRenderPass rp;
21563 VkRenderPassCreateInfo rp_info = {};
21564 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21565 rp_info.attachmentCount = 1;
21566 rp_info.pAttachments = &att;
21567 rp_info.subpassCount = 1;
21568 rp_info.pSubpasses = &subpass;
21569 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
21570 ASSERT_VK_SUCCESS(result);
21571
21572 VkImageView *depthView = m_depthStencil->BindInfo();
21573 VkFramebufferCreateInfo fb_info = {};
21574 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
21575 fb_info.pNext = NULL;
21576 fb_info.renderPass = rp;
21577 fb_info.attachmentCount = 1;
21578 fb_info.pAttachments = depthView;
21579 fb_info.width = 100;
21580 fb_info.height = 100;
21581 fb_info.layers = 1;
21582 VkFramebuffer fb;
21583 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
21584 ASSERT_VK_SUCCESS(result);
21585
21586 VkRenderPassBeginInfo rpbinfo = {};
21587 rpbinfo.clearValueCount = 1;
21588 rpbinfo.pClearValues = &clear;
21589 rpbinfo.pNext = NULL;
21590 rpbinfo.renderPass = rp;
21591 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
21592 rpbinfo.renderArea.extent.width = 100;
21593 rpbinfo.renderArea.extent.height = 100;
21594 rpbinfo.renderArea.offset.x = 0;
21595 rpbinfo.renderArea.offset.y = 0;
21596 rpbinfo.framebuffer = fb;
21597
21598 VkFence fence = {};
21599 VkFenceCreateInfo fence_ci = {};
21600 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21601 fence_ci.pNext = nullptr;
21602 fence_ci.flags = 0;
21603 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
21604 ASSERT_VK_SUCCESS(result);
21605
21606 m_commandBuffer->BeginCommandBuffer();
21607 m_commandBuffer->BeginRenderPass(rpbinfo);
21608 m_commandBuffer->EndRenderPass();
21609 m_commandBuffer->EndCommandBuffer();
21610 m_commandBuffer->QueueCommandBuffer(fence);
21611
21612 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021613 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 -070021614 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021615 VkImageMemoryBarrier barrier = {};
21616 VkImageSubresourceRange range;
21617 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21618 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21619 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
21620 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21621 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
21622 barrier.image = m_depthStencil->handle();
21623 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21624 range.baseMipLevel = 0;
21625 range.levelCount = 1;
21626 range.baseArrayLayer = 0;
21627 range.layerCount = 1;
21628 barrier.subresourceRange = range;
21629 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21630 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
21631 cmdbuf.BeginCommandBuffer();
21632 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 -070021633 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021634 barrier.srcAccessMask = 0;
21635 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
21636 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
21637 barrier.image = destImage.handle();
21638 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21639 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 -070021640 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021641 VkImageCopy cregion;
21642 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21643 cregion.srcSubresource.mipLevel = 0;
21644 cregion.srcSubresource.baseArrayLayer = 0;
21645 cregion.srcSubresource.layerCount = 1;
21646 cregion.srcOffset.x = 0;
21647 cregion.srcOffset.y = 0;
21648 cregion.srcOffset.z = 0;
21649 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21650 cregion.dstSubresource.mipLevel = 0;
21651 cregion.dstSubresource.baseArrayLayer = 0;
21652 cregion.dstSubresource.layerCount = 1;
21653 cregion.dstOffset.x = 0;
21654 cregion.dstOffset.y = 0;
21655 cregion.dstOffset.z = 0;
21656 cregion.extent.width = 100;
21657 cregion.extent.height = 100;
21658 cregion.extent.depth = 1;
21659 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021660 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021661 cmdbuf.EndCommandBuffer();
21662
21663 VkSubmitInfo submit_info;
21664 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21665 submit_info.pNext = NULL;
21666 submit_info.waitSemaphoreCount = 0;
21667 submit_info.pWaitSemaphores = NULL;
21668 submit_info.pWaitDstStageMask = NULL;
21669 submit_info.commandBufferCount = 1;
21670 submit_info.pCommandBuffers = &cmdbuf.handle();
21671 submit_info.signalSemaphoreCount = 0;
21672 submit_info.pSignalSemaphores = NULL;
21673
21674 m_errorMonitor->ExpectSuccess();
21675 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21676 m_errorMonitor->VerifyNotFound();
21677
21678 vkQueueWaitIdle(m_device->m_queue);
21679 vkDestroyFence(m_device->device(), fence, nullptr);
21680 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21681 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21682}
21683
21684// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070021685TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
21686 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
21687
21688 m_errorMonitor->ExpectSuccess();
21689
Tony Barbour1fa09702017-03-16 12:09:08 -060021690 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021691 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060021692 if (!depth_format) {
21693 printf(" No Depth + Stencil format found. Skipped.\n");
21694 return;
21695 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070021696 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21697
21698 VkImageMemoryBarrier img_barrier = {};
21699 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21700 img_barrier.pNext = NULL;
21701 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
21702 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
21703 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
21704 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
21705 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
21706 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
21707 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
21708 img_barrier.subresourceRange.baseArrayLayer = 0;
21709 img_barrier.subresourceRange.baseMipLevel = 0;
21710 img_barrier.subresourceRange.layerCount = 1;
21711 img_barrier.subresourceRange.levelCount = 1;
21712
21713 {
21714 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021715 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 -070021716 ASSERT_TRUE(img_color.initialized());
21717
21718 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021719 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 -070021720 ASSERT_TRUE(img_ds1.initialized());
21721
21722 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021723 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 -070021724 ASSERT_TRUE(img_ds2.initialized());
21725
21726 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021727 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 -070021728 ASSERT_TRUE(img_xfer_src.initialized());
21729
21730 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021731 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 -070021732 ASSERT_TRUE(img_xfer_dst.initialized());
21733
21734 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021735 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 -070021736 ASSERT_TRUE(img_sampled.initialized());
21737
21738 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021739 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 -070021740 ASSERT_TRUE(img_input.initialized());
21741
21742 const struct {
21743 VkImageObj &image_obj;
21744 VkImageLayout old_layout;
21745 VkImageLayout new_layout;
21746 } buffer_layouts[] = {
21747 // clang-format off
21748 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21749 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21750 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21751 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21752 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21753 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21754 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21755 // clang-format on
21756 };
21757 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
21758
21759 m_commandBuffer->BeginCommandBuffer();
21760 for (uint32_t i = 0; i < layout_count; ++i) {
21761 img_barrier.image = buffer_layouts[i].image_obj.handle();
21762 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
21763 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
21764 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
21765 : VK_IMAGE_ASPECT_COLOR_BIT;
21766
21767 img_barrier.oldLayout = buffer_layouts[i].old_layout;
21768 img_barrier.newLayout = buffer_layouts[i].new_layout;
21769 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
21770 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
21771
21772 img_barrier.oldLayout = buffer_layouts[i].new_layout;
21773 img_barrier.newLayout = buffer_layouts[i].old_layout;
21774 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
21775 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
21776 }
21777 m_commandBuffer->EndCommandBuffer();
21778
21779 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
21780 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
21781 }
21782 m_errorMonitor->VerifyNotFound();
21783}
21784
21785// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021786TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
21787 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
21788
21789 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021790 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021791
21792 VkEvent event;
21793 VkEventCreateInfo event_create_info{};
21794 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21795 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21796
21797 VkCommandPool command_pool;
21798 VkCommandPoolCreateInfo pool_create_info{};
21799 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21800 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21801 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21802 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21803
21804 VkCommandBuffer command_buffer;
21805 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21806 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21807 command_buffer_allocate_info.commandPool = command_pool;
21808 command_buffer_allocate_info.commandBufferCount = 1;
21809 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21810 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21811
21812 VkQueue queue = VK_NULL_HANDLE;
21813 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21814
21815 {
21816 VkCommandBufferBeginInfo begin_info{};
21817 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21818 vkBeginCommandBuffer(command_buffer, &begin_info);
21819
21820 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 -070021821 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021822 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
21823 vkEndCommandBuffer(command_buffer);
21824 }
21825 {
21826 VkSubmitInfo submit_info{};
21827 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21828 submit_info.commandBufferCount = 1;
21829 submit_info.pCommandBuffers = &command_buffer;
21830 submit_info.signalSemaphoreCount = 0;
21831 submit_info.pSignalSemaphores = nullptr;
21832 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21833 }
21834 { vkSetEvent(m_device->device(), event); }
21835
21836 vkQueueWaitIdle(queue);
21837
21838 vkDestroyEvent(m_device->device(), event, nullptr);
21839 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21840 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21841
21842 m_errorMonitor->VerifyNotFound();
21843}
21844// This is a positive test. No errors should be generated.
21845TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
21846 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
21847
Tony Barbour1fa09702017-03-16 12:09:08 -060021848 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021849 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021850
21851 m_errorMonitor->ExpectSuccess();
21852
21853 VkQueryPool query_pool;
21854 VkQueryPoolCreateInfo query_pool_create_info{};
21855 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21856 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21857 query_pool_create_info.queryCount = 1;
21858 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21859
21860 VkCommandPool command_pool;
21861 VkCommandPoolCreateInfo pool_create_info{};
21862 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21863 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21864 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21865 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21866
21867 VkCommandBuffer command_buffer;
21868 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21869 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21870 command_buffer_allocate_info.commandPool = command_pool;
21871 command_buffer_allocate_info.commandBufferCount = 1;
21872 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21873 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21874
21875 VkCommandBuffer secondary_command_buffer;
21876 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
21877 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
21878
21879 VkQueue queue = VK_NULL_HANDLE;
21880 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21881
21882 uint32_t qfi = 0;
21883 VkBufferCreateInfo buff_create_info = {};
21884 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21885 buff_create_info.size = 1024;
21886 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21887 buff_create_info.queueFamilyIndexCount = 1;
21888 buff_create_info.pQueueFamilyIndices = &qfi;
21889
21890 VkResult err;
21891 VkBuffer buffer;
21892 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21893 ASSERT_VK_SUCCESS(err);
21894 VkMemoryAllocateInfo mem_alloc = {};
21895 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21896 mem_alloc.pNext = NULL;
21897 mem_alloc.allocationSize = 1024;
21898 mem_alloc.memoryTypeIndex = 0;
21899
21900 VkMemoryRequirements memReqs;
21901 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21902 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21903 if (!pass) {
21904 vkDestroyBuffer(m_device->device(), buffer, NULL);
21905 return;
21906 }
21907
21908 VkDeviceMemory mem;
21909 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21910 ASSERT_VK_SUCCESS(err);
21911 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21912 ASSERT_VK_SUCCESS(err);
21913
21914 VkCommandBufferInheritanceInfo hinfo = {};
21915 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
21916 hinfo.renderPass = VK_NULL_HANDLE;
21917 hinfo.subpass = 0;
21918 hinfo.framebuffer = VK_NULL_HANDLE;
21919 hinfo.occlusionQueryEnable = VK_FALSE;
21920 hinfo.queryFlags = 0;
21921 hinfo.pipelineStatistics = 0;
21922
21923 {
21924 VkCommandBufferBeginInfo begin_info{};
21925 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21926 begin_info.pInheritanceInfo = &hinfo;
21927 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
21928
21929 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
21930 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21931
21932 vkEndCommandBuffer(secondary_command_buffer);
21933
21934 begin_info.pInheritanceInfo = nullptr;
21935 vkBeginCommandBuffer(command_buffer, &begin_info);
21936
21937 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
21938 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
21939
21940 vkEndCommandBuffer(command_buffer);
21941 }
21942 {
21943 VkSubmitInfo submit_info{};
21944 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21945 submit_info.commandBufferCount = 1;
21946 submit_info.pCommandBuffers = &command_buffer;
21947 submit_info.signalSemaphoreCount = 0;
21948 submit_info.pSignalSemaphores = nullptr;
21949 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21950 }
21951
21952 vkQueueWaitIdle(queue);
21953
21954 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21955 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21956 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21957 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21958 vkDestroyBuffer(m_device->device(), buffer, NULL);
21959 vkFreeMemory(m_device->device(), mem, NULL);
21960
21961 m_errorMonitor->VerifyNotFound();
21962}
21963
21964// This is a positive test. No errors should be generated.
21965TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21966 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21967
Tony Barbour1fa09702017-03-16 12:09:08 -060021968 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021969 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021970
21971 m_errorMonitor->ExpectSuccess();
21972
21973 VkQueryPool query_pool;
21974 VkQueryPoolCreateInfo query_pool_create_info{};
21975 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21976 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21977 query_pool_create_info.queryCount = 1;
21978 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21979
21980 VkCommandPool command_pool;
21981 VkCommandPoolCreateInfo pool_create_info{};
21982 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21983 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21984 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21985 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21986
21987 VkCommandBuffer command_buffer[2];
21988 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21989 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21990 command_buffer_allocate_info.commandPool = command_pool;
21991 command_buffer_allocate_info.commandBufferCount = 2;
21992 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21993 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21994
21995 VkQueue queue = VK_NULL_HANDLE;
21996 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21997
21998 uint32_t qfi = 0;
21999 VkBufferCreateInfo buff_create_info = {};
22000 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22001 buff_create_info.size = 1024;
22002 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
22003 buff_create_info.queueFamilyIndexCount = 1;
22004 buff_create_info.pQueueFamilyIndices = &qfi;
22005
22006 VkResult err;
22007 VkBuffer buffer;
22008 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
22009 ASSERT_VK_SUCCESS(err);
22010 VkMemoryAllocateInfo mem_alloc = {};
22011 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22012 mem_alloc.pNext = NULL;
22013 mem_alloc.allocationSize = 1024;
22014 mem_alloc.memoryTypeIndex = 0;
22015
22016 VkMemoryRequirements memReqs;
22017 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
22018 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
22019 if (!pass) {
22020 vkDestroyBuffer(m_device->device(), buffer, NULL);
22021 return;
22022 }
22023
22024 VkDeviceMemory mem;
22025 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
22026 ASSERT_VK_SUCCESS(err);
22027 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
22028 ASSERT_VK_SUCCESS(err);
22029
22030 {
22031 VkCommandBufferBeginInfo begin_info{};
22032 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22033 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22034
22035 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
22036 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
22037
22038 vkEndCommandBuffer(command_buffer[0]);
22039
22040 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22041
22042 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
22043
22044 vkEndCommandBuffer(command_buffer[1]);
22045 }
22046 {
22047 VkSubmitInfo submit_info{};
22048 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22049 submit_info.commandBufferCount = 2;
22050 submit_info.pCommandBuffers = command_buffer;
22051 submit_info.signalSemaphoreCount = 0;
22052 submit_info.pSignalSemaphores = nullptr;
22053 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22054 }
22055
22056 vkQueueWaitIdle(queue);
22057
22058 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
22059 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
22060 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22061 vkDestroyBuffer(m_device->device(), buffer, NULL);
22062 vkFreeMemory(m_device->device(), mem, NULL);
22063
22064 m_errorMonitor->VerifyNotFound();
22065}
22066
Tony Barbourc46924f2016-11-04 11:49:52 -060022067TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022068 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
22069
Tony Barbour1fa09702017-03-16 12:09:08 -060022070 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022071 VkEvent event;
22072 VkEventCreateInfo event_create_info{};
22073 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
22074 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
22075
22076 VkCommandPool command_pool;
22077 VkCommandPoolCreateInfo pool_create_info{};
22078 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22079 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22080 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22081 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22082
22083 VkCommandBuffer command_buffer;
22084 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22085 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22086 command_buffer_allocate_info.commandPool = command_pool;
22087 command_buffer_allocate_info.commandBufferCount = 1;
22088 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22089 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
22090
22091 VkQueue queue = VK_NULL_HANDLE;
22092 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
22093
22094 {
22095 VkCommandBufferBeginInfo begin_info{};
22096 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22097 vkBeginCommandBuffer(command_buffer, &begin_info);
22098
22099 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022100 vkEndCommandBuffer(command_buffer);
22101 }
22102 {
22103 VkSubmitInfo submit_info{};
22104 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22105 submit_info.commandBufferCount = 1;
22106 submit_info.pCommandBuffers = &command_buffer;
22107 submit_info.signalSemaphoreCount = 0;
22108 submit_info.pSignalSemaphores = nullptr;
22109 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22110 }
22111 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
22113 "that is already in use by a "
22114 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022115 vkSetEvent(m_device->device(), event);
22116 m_errorMonitor->VerifyFound();
22117 }
22118
22119 vkQueueWaitIdle(queue);
22120
22121 vkDestroyEvent(m_device->device(), event, nullptr);
22122 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
22123 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22124}
22125
22126// This is a positive test. No errors should be generated.
22127TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022128 TEST_DESCRIPTION(
22129 "Two command buffers with two separate fences are each "
22130 "run through a Submit & WaitForFences cycle 3 times. This "
22131 "previously revealed a bug so running this positive test "
22132 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022133 m_errorMonitor->ExpectSuccess();
22134
Tony Barbour1fa09702017-03-16 12:09:08 -060022135 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022136 VkQueue queue = VK_NULL_HANDLE;
22137 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
22138
22139 static const uint32_t NUM_OBJECTS = 2;
22140 static const uint32_t NUM_FRAMES = 3;
22141 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
22142 VkFence fences[NUM_OBJECTS] = {};
22143
22144 VkCommandPool cmd_pool;
22145 VkCommandPoolCreateInfo cmd_pool_ci = {};
22146 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22147 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
22148 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22149 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
22150 ASSERT_VK_SUCCESS(err);
22151
22152 VkCommandBufferAllocateInfo cmd_buf_info = {};
22153 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22154 cmd_buf_info.commandPool = cmd_pool;
22155 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22156 cmd_buf_info.commandBufferCount = 1;
22157
22158 VkFenceCreateInfo fence_ci = {};
22159 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22160 fence_ci.pNext = nullptr;
22161 fence_ci.flags = 0;
22162
22163 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
22164 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
22165 ASSERT_VK_SUCCESS(err);
22166 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
22167 ASSERT_VK_SUCCESS(err);
22168 }
22169
22170 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
22171 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
22172 // Create empty cmd buffer
22173 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
22174 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22175
22176 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
22177 ASSERT_VK_SUCCESS(err);
22178 err = vkEndCommandBuffer(cmd_buffers[obj]);
22179 ASSERT_VK_SUCCESS(err);
22180
22181 VkSubmitInfo submit_info = {};
22182 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22183 submit_info.commandBufferCount = 1;
22184 submit_info.pCommandBuffers = &cmd_buffers[obj];
22185 // Submit cmd buffer and wait for fence
22186 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
22187 ASSERT_VK_SUCCESS(err);
22188 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
22189 ASSERT_VK_SUCCESS(err);
22190 err = vkResetFences(m_device->device(), 1, &fences[obj]);
22191 ASSERT_VK_SUCCESS(err);
22192 }
22193 }
22194 m_errorMonitor->VerifyNotFound();
22195 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
22196 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
22197 vkDestroyFence(m_device->device(), fences[i], nullptr);
22198 }
22199}
22200// This is a positive test. No errors should be generated.
22201TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022202 TEST_DESCRIPTION(
22203 "Two command buffers, each in a separate QueueSubmit call "
22204 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022205
Tony Barbour1fa09702017-03-16 12:09:08 -060022206 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022207 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022208
22209 m_errorMonitor->ExpectSuccess();
22210
22211 VkSemaphore semaphore;
22212 VkSemaphoreCreateInfo semaphore_create_info{};
22213 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22214 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22215
22216 VkCommandPool command_pool;
22217 VkCommandPoolCreateInfo pool_create_info{};
22218 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22219 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22220 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22221 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22222
22223 VkCommandBuffer command_buffer[2];
22224 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22225 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22226 command_buffer_allocate_info.commandPool = command_pool;
22227 command_buffer_allocate_info.commandBufferCount = 2;
22228 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22229 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22230
22231 VkQueue queue = VK_NULL_HANDLE;
22232 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22233
22234 {
22235 VkCommandBufferBeginInfo begin_info{};
22236 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22237 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22238
22239 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 -070022240 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022241
22242 VkViewport viewport{};
22243 viewport.maxDepth = 1.0f;
22244 viewport.minDepth = 0.0f;
22245 viewport.width = 512;
22246 viewport.height = 512;
22247 viewport.x = 0;
22248 viewport.y = 0;
22249 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22250 vkEndCommandBuffer(command_buffer[0]);
22251 }
22252 {
22253 VkCommandBufferBeginInfo begin_info{};
22254 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22255 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22256
22257 VkViewport viewport{};
22258 viewport.maxDepth = 1.0f;
22259 viewport.minDepth = 0.0f;
22260 viewport.width = 512;
22261 viewport.height = 512;
22262 viewport.x = 0;
22263 viewport.y = 0;
22264 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22265 vkEndCommandBuffer(command_buffer[1]);
22266 }
22267 {
22268 VkSubmitInfo submit_info{};
22269 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22270 submit_info.commandBufferCount = 1;
22271 submit_info.pCommandBuffers = &command_buffer[0];
22272 submit_info.signalSemaphoreCount = 1;
22273 submit_info.pSignalSemaphores = &semaphore;
22274 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22275 }
22276 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022277 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022278 VkSubmitInfo submit_info{};
22279 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22280 submit_info.commandBufferCount = 1;
22281 submit_info.pCommandBuffers = &command_buffer[1];
22282 submit_info.waitSemaphoreCount = 1;
22283 submit_info.pWaitSemaphores = &semaphore;
22284 submit_info.pWaitDstStageMask = flags;
22285 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22286 }
22287
22288 vkQueueWaitIdle(m_device->m_queue);
22289
22290 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22291 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22292 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22293
22294 m_errorMonitor->VerifyNotFound();
22295}
22296
22297// This is a positive test. No errors should be generated.
22298TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022299 TEST_DESCRIPTION(
22300 "Two command buffers, each in a separate QueueSubmit call "
22301 "submitted on separate queues, the second having a fence"
22302 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022303
Tony Barbour1fa09702017-03-16 12:09:08 -060022304 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022305 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022306
22307 m_errorMonitor->ExpectSuccess();
22308
22309 VkFence fence;
22310 VkFenceCreateInfo fence_create_info{};
22311 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22312 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22313
22314 VkSemaphore semaphore;
22315 VkSemaphoreCreateInfo semaphore_create_info{};
22316 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22317 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22318
22319 VkCommandPool command_pool;
22320 VkCommandPoolCreateInfo pool_create_info{};
22321 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22322 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22323 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22324 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22325
22326 VkCommandBuffer command_buffer[2];
22327 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22328 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22329 command_buffer_allocate_info.commandPool = command_pool;
22330 command_buffer_allocate_info.commandBufferCount = 2;
22331 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22332 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22333
22334 VkQueue queue = VK_NULL_HANDLE;
22335 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22336
22337 {
22338 VkCommandBufferBeginInfo begin_info{};
22339 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22340 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22341
22342 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 -070022343 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022344
22345 VkViewport viewport{};
22346 viewport.maxDepth = 1.0f;
22347 viewport.minDepth = 0.0f;
22348 viewport.width = 512;
22349 viewport.height = 512;
22350 viewport.x = 0;
22351 viewport.y = 0;
22352 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22353 vkEndCommandBuffer(command_buffer[0]);
22354 }
22355 {
22356 VkCommandBufferBeginInfo begin_info{};
22357 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22358 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22359
22360 VkViewport viewport{};
22361 viewport.maxDepth = 1.0f;
22362 viewport.minDepth = 0.0f;
22363 viewport.width = 512;
22364 viewport.height = 512;
22365 viewport.x = 0;
22366 viewport.y = 0;
22367 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22368 vkEndCommandBuffer(command_buffer[1]);
22369 }
22370 {
22371 VkSubmitInfo submit_info{};
22372 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22373 submit_info.commandBufferCount = 1;
22374 submit_info.pCommandBuffers = &command_buffer[0];
22375 submit_info.signalSemaphoreCount = 1;
22376 submit_info.pSignalSemaphores = &semaphore;
22377 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22378 }
22379 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022380 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022381 VkSubmitInfo submit_info{};
22382 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22383 submit_info.commandBufferCount = 1;
22384 submit_info.pCommandBuffers = &command_buffer[1];
22385 submit_info.waitSemaphoreCount = 1;
22386 submit_info.pWaitSemaphores = &semaphore;
22387 submit_info.pWaitDstStageMask = flags;
22388 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22389 }
22390
22391 vkQueueWaitIdle(m_device->m_queue);
22392
22393 vkDestroyFence(m_device->device(), fence, nullptr);
22394 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22395 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22396 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22397
22398 m_errorMonitor->VerifyNotFound();
22399}
22400
22401// This is a positive test. No errors should be generated.
22402TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022403 TEST_DESCRIPTION(
22404 "Two command buffers, each in a separate QueueSubmit call "
22405 "submitted on separate queues, the second having a fence"
22406 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022407
Tony Barbour1fa09702017-03-16 12:09:08 -060022408 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022409 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022410
22411 m_errorMonitor->ExpectSuccess();
22412
22413 VkFence fence;
22414 VkFenceCreateInfo fence_create_info{};
22415 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22416 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22417
22418 VkSemaphore semaphore;
22419 VkSemaphoreCreateInfo semaphore_create_info{};
22420 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22421 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22422
22423 VkCommandPool command_pool;
22424 VkCommandPoolCreateInfo pool_create_info{};
22425 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22426 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22427 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22428 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22429
22430 VkCommandBuffer command_buffer[2];
22431 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22432 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22433 command_buffer_allocate_info.commandPool = command_pool;
22434 command_buffer_allocate_info.commandBufferCount = 2;
22435 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22436 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22437
22438 VkQueue queue = VK_NULL_HANDLE;
22439 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22440
22441 {
22442 VkCommandBufferBeginInfo begin_info{};
22443 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22444 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22445
22446 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 -070022447 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022448
22449 VkViewport viewport{};
22450 viewport.maxDepth = 1.0f;
22451 viewport.minDepth = 0.0f;
22452 viewport.width = 512;
22453 viewport.height = 512;
22454 viewport.x = 0;
22455 viewport.y = 0;
22456 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22457 vkEndCommandBuffer(command_buffer[0]);
22458 }
22459 {
22460 VkCommandBufferBeginInfo begin_info{};
22461 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22462 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22463
22464 VkViewport viewport{};
22465 viewport.maxDepth = 1.0f;
22466 viewport.minDepth = 0.0f;
22467 viewport.width = 512;
22468 viewport.height = 512;
22469 viewport.x = 0;
22470 viewport.y = 0;
22471 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22472 vkEndCommandBuffer(command_buffer[1]);
22473 }
22474 {
22475 VkSubmitInfo submit_info{};
22476 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22477 submit_info.commandBufferCount = 1;
22478 submit_info.pCommandBuffers = &command_buffer[0];
22479 submit_info.signalSemaphoreCount = 1;
22480 submit_info.pSignalSemaphores = &semaphore;
22481 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22482 }
22483 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022484 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022485 VkSubmitInfo submit_info{};
22486 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22487 submit_info.commandBufferCount = 1;
22488 submit_info.pCommandBuffers = &command_buffer[1];
22489 submit_info.waitSemaphoreCount = 1;
22490 submit_info.pWaitSemaphores = &semaphore;
22491 submit_info.pWaitDstStageMask = flags;
22492 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22493 }
22494
22495 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22496 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22497
22498 vkDestroyFence(m_device->device(), fence, nullptr);
22499 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22500 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22501 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22502
22503 m_errorMonitor->VerifyNotFound();
22504}
22505
22506TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060022507 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022508 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022509 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022510 return;
22511 }
22512
22513 VkResult err;
22514
22515 m_errorMonitor->ExpectSuccess();
22516
22517 VkQueue q0 = m_device->m_queue;
22518 VkQueue q1 = nullptr;
22519 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
22520 ASSERT_NE(q1, nullptr);
22521
22522 // An (empty) command buffer. We must have work in the first submission --
22523 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022524 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022525 VkCommandPool pool;
22526 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
22527 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022528 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
22529 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022530 VkCommandBuffer cb;
22531 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
22532 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022533 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022534 err = vkBeginCommandBuffer(cb, &cbbi);
22535 ASSERT_VK_SUCCESS(err);
22536 err = vkEndCommandBuffer(cb);
22537 ASSERT_VK_SUCCESS(err);
22538
22539 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022540 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022541 VkSemaphore s;
22542 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
22543 ASSERT_VK_SUCCESS(err);
22544
22545 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022546 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022547
22548 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
22549 ASSERT_VK_SUCCESS(err);
22550
22551 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022552 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022553 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022554
22555 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
22556 ASSERT_VK_SUCCESS(err);
22557
22558 // Wait for q0 idle
22559 err = vkQueueWaitIdle(q0);
22560 ASSERT_VK_SUCCESS(err);
22561
22562 // Command buffer should have been completed (it was on q0); reset the pool.
22563 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
22564
22565 m_errorMonitor->VerifyNotFound();
22566
22567 // Force device completely idle and clean up resources
22568 vkDeviceWaitIdle(m_device->device());
22569 vkDestroyCommandPool(m_device->device(), pool, nullptr);
22570 vkDestroySemaphore(m_device->device(), s, nullptr);
22571}
22572
22573// This is a positive test. No errors should be generated.
22574TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022575 TEST_DESCRIPTION(
22576 "Two command buffers, each in a separate QueueSubmit call "
22577 "submitted on separate queues, the second having a fence, "
22578 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022579
Tony Barbour1fa09702017-03-16 12:09:08 -060022580 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022581 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022582
22583 m_errorMonitor->ExpectSuccess();
22584
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022585 VkFence fence;
22586 VkFenceCreateInfo fence_create_info{};
22587 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22588 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22589
22590 VkSemaphore semaphore;
22591 VkSemaphoreCreateInfo semaphore_create_info{};
22592 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22593 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22594
22595 VkCommandPool command_pool;
22596 VkCommandPoolCreateInfo pool_create_info{};
22597 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22598 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22599 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22600 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22601
22602 VkCommandBuffer command_buffer[2];
22603 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22604 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22605 command_buffer_allocate_info.commandPool = command_pool;
22606 command_buffer_allocate_info.commandBufferCount = 2;
22607 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22608 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22609
22610 VkQueue queue = VK_NULL_HANDLE;
22611 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22612
22613 {
22614 VkCommandBufferBeginInfo begin_info{};
22615 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22616 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22617
22618 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 -070022619 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022620
22621 VkViewport viewport{};
22622 viewport.maxDepth = 1.0f;
22623 viewport.minDepth = 0.0f;
22624 viewport.width = 512;
22625 viewport.height = 512;
22626 viewport.x = 0;
22627 viewport.y = 0;
22628 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22629 vkEndCommandBuffer(command_buffer[0]);
22630 }
22631 {
22632 VkCommandBufferBeginInfo begin_info{};
22633 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22634 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22635
22636 VkViewport viewport{};
22637 viewport.maxDepth = 1.0f;
22638 viewport.minDepth = 0.0f;
22639 viewport.width = 512;
22640 viewport.height = 512;
22641 viewport.x = 0;
22642 viewport.y = 0;
22643 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22644 vkEndCommandBuffer(command_buffer[1]);
22645 }
22646 {
22647 VkSubmitInfo submit_info{};
22648 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22649 submit_info.commandBufferCount = 1;
22650 submit_info.pCommandBuffers = &command_buffer[0];
22651 submit_info.signalSemaphoreCount = 1;
22652 submit_info.pSignalSemaphores = &semaphore;
22653 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22654 }
22655 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022656 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022657 VkSubmitInfo submit_info{};
22658 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22659 submit_info.commandBufferCount = 1;
22660 submit_info.pCommandBuffers = &command_buffer[1];
22661 submit_info.waitSemaphoreCount = 1;
22662 submit_info.pWaitSemaphores = &semaphore;
22663 submit_info.pWaitDstStageMask = flags;
22664 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22665 }
22666
22667 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22668
22669 vkDestroyFence(m_device->device(), fence, nullptr);
22670 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22671 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22672 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22673
22674 m_errorMonitor->VerifyNotFound();
22675}
22676
22677// This is a positive test. No errors should be generated.
22678TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022679 TEST_DESCRIPTION(
22680 "Two command buffers, each in a separate QueueSubmit call "
22681 "on the same queue, sharing a signal/wait semaphore, the "
22682 "second having a fence, "
22683 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022684
22685 m_errorMonitor->ExpectSuccess();
22686
Tony Barbour1fa09702017-03-16 12:09:08 -060022687 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022688 VkFence fence;
22689 VkFenceCreateInfo fence_create_info{};
22690 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22691 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22692
22693 VkSemaphore semaphore;
22694 VkSemaphoreCreateInfo semaphore_create_info{};
22695 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22696 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22697
22698 VkCommandPool command_pool;
22699 VkCommandPoolCreateInfo pool_create_info{};
22700 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22701 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22702 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22703 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22704
22705 VkCommandBuffer command_buffer[2];
22706 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22707 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22708 command_buffer_allocate_info.commandPool = command_pool;
22709 command_buffer_allocate_info.commandBufferCount = 2;
22710 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22711 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22712
22713 {
22714 VkCommandBufferBeginInfo begin_info{};
22715 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22716 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22717
22718 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 -070022719 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022720
22721 VkViewport viewport{};
22722 viewport.maxDepth = 1.0f;
22723 viewport.minDepth = 0.0f;
22724 viewport.width = 512;
22725 viewport.height = 512;
22726 viewport.x = 0;
22727 viewport.y = 0;
22728 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22729 vkEndCommandBuffer(command_buffer[0]);
22730 }
22731 {
22732 VkCommandBufferBeginInfo begin_info{};
22733 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22734 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22735
22736 VkViewport viewport{};
22737 viewport.maxDepth = 1.0f;
22738 viewport.minDepth = 0.0f;
22739 viewport.width = 512;
22740 viewport.height = 512;
22741 viewport.x = 0;
22742 viewport.y = 0;
22743 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22744 vkEndCommandBuffer(command_buffer[1]);
22745 }
22746 {
22747 VkSubmitInfo submit_info{};
22748 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22749 submit_info.commandBufferCount = 1;
22750 submit_info.pCommandBuffers = &command_buffer[0];
22751 submit_info.signalSemaphoreCount = 1;
22752 submit_info.pSignalSemaphores = &semaphore;
22753 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22754 }
22755 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022756 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022757 VkSubmitInfo submit_info{};
22758 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22759 submit_info.commandBufferCount = 1;
22760 submit_info.pCommandBuffers = &command_buffer[1];
22761 submit_info.waitSemaphoreCount = 1;
22762 submit_info.pWaitSemaphores = &semaphore;
22763 submit_info.pWaitDstStageMask = flags;
22764 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22765 }
22766
22767 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22768
22769 vkDestroyFence(m_device->device(), fence, nullptr);
22770 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22771 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22772 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22773
22774 m_errorMonitor->VerifyNotFound();
22775}
22776
22777// This is a positive test. No errors should be generated.
22778TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022779 TEST_DESCRIPTION(
22780 "Two command buffers, each in a separate QueueSubmit call "
22781 "on the same queue, no fences, followed by a third QueueSubmit with NO "
22782 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022783
22784 m_errorMonitor->ExpectSuccess();
22785
Tony Barbour1fa09702017-03-16 12:09:08 -060022786 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022787 VkFence fence;
22788 VkFenceCreateInfo fence_create_info{};
22789 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22790 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22791
22792 VkCommandPool command_pool;
22793 VkCommandPoolCreateInfo pool_create_info{};
22794 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22795 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22796 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22797 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22798
22799 VkCommandBuffer command_buffer[2];
22800 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22801 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22802 command_buffer_allocate_info.commandPool = command_pool;
22803 command_buffer_allocate_info.commandBufferCount = 2;
22804 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22805 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22806
22807 {
22808 VkCommandBufferBeginInfo begin_info{};
22809 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22810 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22811
22812 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 -070022813 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022814
22815 VkViewport viewport{};
22816 viewport.maxDepth = 1.0f;
22817 viewport.minDepth = 0.0f;
22818 viewport.width = 512;
22819 viewport.height = 512;
22820 viewport.x = 0;
22821 viewport.y = 0;
22822 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22823 vkEndCommandBuffer(command_buffer[0]);
22824 }
22825 {
22826 VkCommandBufferBeginInfo begin_info{};
22827 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22828 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22829
22830 VkViewport viewport{};
22831 viewport.maxDepth = 1.0f;
22832 viewport.minDepth = 0.0f;
22833 viewport.width = 512;
22834 viewport.height = 512;
22835 viewport.x = 0;
22836 viewport.y = 0;
22837 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22838 vkEndCommandBuffer(command_buffer[1]);
22839 }
22840 {
22841 VkSubmitInfo submit_info{};
22842 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22843 submit_info.commandBufferCount = 1;
22844 submit_info.pCommandBuffers = &command_buffer[0];
22845 submit_info.signalSemaphoreCount = 0;
22846 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22847 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22848 }
22849 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022850 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022851 VkSubmitInfo submit_info{};
22852 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22853 submit_info.commandBufferCount = 1;
22854 submit_info.pCommandBuffers = &command_buffer[1];
22855 submit_info.waitSemaphoreCount = 0;
22856 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22857 submit_info.pWaitDstStageMask = flags;
22858 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22859 }
22860
22861 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
22862
22863 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22864 ASSERT_VK_SUCCESS(err);
22865
22866 vkDestroyFence(m_device->device(), fence, nullptr);
22867 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22868 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22869
22870 m_errorMonitor->VerifyNotFound();
22871}
22872
22873// This is a positive test. No errors should be generated.
22874TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022875 TEST_DESCRIPTION(
22876 "Two command buffers, each in a separate QueueSubmit call "
22877 "on the same queue, the second having a fence, followed "
22878 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022879
22880 m_errorMonitor->ExpectSuccess();
22881
Tony Barbour1fa09702017-03-16 12:09:08 -060022882 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022883 VkFence fence;
22884 VkFenceCreateInfo fence_create_info{};
22885 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22886 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22887
22888 VkCommandPool command_pool;
22889 VkCommandPoolCreateInfo pool_create_info{};
22890 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22891 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22892 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22893 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22894
22895 VkCommandBuffer command_buffer[2];
22896 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22897 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22898 command_buffer_allocate_info.commandPool = command_pool;
22899 command_buffer_allocate_info.commandBufferCount = 2;
22900 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22901 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22902
22903 {
22904 VkCommandBufferBeginInfo begin_info{};
22905 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22906 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22907
22908 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 -070022909 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022910
22911 VkViewport viewport{};
22912 viewport.maxDepth = 1.0f;
22913 viewport.minDepth = 0.0f;
22914 viewport.width = 512;
22915 viewport.height = 512;
22916 viewport.x = 0;
22917 viewport.y = 0;
22918 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22919 vkEndCommandBuffer(command_buffer[0]);
22920 }
22921 {
22922 VkCommandBufferBeginInfo begin_info{};
22923 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22924 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22925
22926 VkViewport viewport{};
22927 viewport.maxDepth = 1.0f;
22928 viewport.minDepth = 0.0f;
22929 viewport.width = 512;
22930 viewport.height = 512;
22931 viewport.x = 0;
22932 viewport.y = 0;
22933 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22934 vkEndCommandBuffer(command_buffer[1]);
22935 }
22936 {
22937 VkSubmitInfo submit_info{};
22938 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22939 submit_info.commandBufferCount = 1;
22940 submit_info.pCommandBuffers = &command_buffer[0];
22941 submit_info.signalSemaphoreCount = 0;
22942 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22943 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22944 }
22945 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022946 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022947 VkSubmitInfo submit_info{};
22948 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22949 submit_info.commandBufferCount = 1;
22950 submit_info.pCommandBuffers = &command_buffer[1];
22951 submit_info.waitSemaphoreCount = 0;
22952 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22953 submit_info.pWaitDstStageMask = flags;
22954 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22955 }
22956
22957 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22958
22959 vkDestroyFence(m_device->device(), fence, nullptr);
22960 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22961 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22962
22963 m_errorMonitor->VerifyNotFound();
22964}
22965
22966// This is a positive test. No errors should be generated.
22967TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022968 TEST_DESCRIPTION(
22969 "Two command buffers each in a separate SubmitInfo sent in a single "
22970 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022971 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022972
22973 m_errorMonitor->ExpectSuccess();
22974
22975 VkFence fence;
22976 VkFenceCreateInfo fence_create_info{};
22977 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22978 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22979
22980 VkSemaphore semaphore;
22981 VkSemaphoreCreateInfo semaphore_create_info{};
22982 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22983 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22984
22985 VkCommandPool command_pool;
22986 VkCommandPoolCreateInfo pool_create_info{};
22987 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22988 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22989 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22990 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22991
22992 VkCommandBuffer command_buffer[2];
22993 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22994 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22995 command_buffer_allocate_info.commandPool = command_pool;
22996 command_buffer_allocate_info.commandBufferCount = 2;
22997 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22998 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22999
23000 {
23001 VkCommandBufferBeginInfo begin_info{};
23002 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23003 vkBeginCommandBuffer(command_buffer[0], &begin_info);
23004
23005 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 -070023006 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023007
23008 VkViewport viewport{};
23009 viewport.maxDepth = 1.0f;
23010 viewport.minDepth = 0.0f;
23011 viewport.width = 512;
23012 viewport.height = 512;
23013 viewport.x = 0;
23014 viewport.y = 0;
23015 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
23016 vkEndCommandBuffer(command_buffer[0]);
23017 }
23018 {
23019 VkCommandBufferBeginInfo begin_info{};
23020 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23021 vkBeginCommandBuffer(command_buffer[1], &begin_info);
23022
23023 VkViewport viewport{};
23024 viewport.maxDepth = 1.0f;
23025 viewport.minDepth = 0.0f;
23026 viewport.width = 512;
23027 viewport.height = 512;
23028 viewport.x = 0;
23029 viewport.y = 0;
23030 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
23031 vkEndCommandBuffer(command_buffer[1]);
23032 }
23033 {
23034 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023035 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023036
23037 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23038 submit_info[0].pNext = NULL;
23039 submit_info[0].commandBufferCount = 1;
23040 submit_info[0].pCommandBuffers = &command_buffer[0];
23041 submit_info[0].signalSemaphoreCount = 1;
23042 submit_info[0].pSignalSemaphores = &semaphore;
23043 submit_info[0].waitSemaphoreCount = 0;
23044 submit_info[0].pWaitSemaphores = NULL;
23045 submit_info[0].pWaitDstStageMask = 0;
23046
23047 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
23048 submit_info[1].pNext = NULL;
23049 submit_info[1].commandBufferCount = 1;
23050 submit_info[1].pCommandBuffers = &command_buffer[1];
23051 submit_info[1].waitSemaphoreCount = 1;
23052 submit_info[1].pWaitSemaphores = &semaphore;
23053 submit_info[1].pWaitDstStageMask = flags;
23054 submit_info[1].signalSemaphoreCount = 0;
23055 submit_info[1].pSignalSemaphores = NULL;
23056 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
23057 }
23058
23059 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
23060
23061 vkDestroyFence(m_device->device(), fence, nullptr);
23062 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
23063 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
23064 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
23065
23066 m_errorMonitor->VerifyNotFound();
23067}
23068
23069TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
23070 m_errorMonitor->ExpectSuccess();
23071
Tony Barbour1fa09702017-03-16 12:09:08 -060023072 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23074
Tony Barbour552f6c02016-12-21 14:34:07 -070023075 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023076
23077 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
23078 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
23079 m_errorMonitor->VerifyNotFound();
23080 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
23081 m_errorMonitor->VerifyNotFound();
23082 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
23083 m_errorMonitor->VerifyNotFound();
23084
23085 m_commandBuffer->EndCommandBuffer();
23086 m_errorMonitor->VerifyNotFound();
23087}
23088
23089TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023090 TEST_DESCRIPTION(
23091 "Positive test where we create a renderpass with an "
23092 "attachment that uses LOAD_OP_CLEAR, the first subpass "
23093 "has a valid layout, and a second subpass then uses a "
23094 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023095 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060023096 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060023097 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070023098 if (!depth_format) {
23099 printf(" No Depth + Stencil format found. Skipped.\n");
23100 return;
23101 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023102
23103 VkAttachmentReference attach[2] = {};
23104 attach[0].attachment = 0;
23105 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
23106 attach[1].attachment = 0;
23107 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
23108 VkSubpassDescription subpasses[2] = {};
23109 // First subpass clears DS attach on load
23110 subpasses[0].pDepthStencilAttachment = &attach[0];
23111 // 2nd subpass reads in DS as input attachment
23112 subpasses[1].inputAttachmentCount = 1;
23113 subpasses[1].pInputAttachments = &attach[1];
23114 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070023115 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023116 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
23117 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
23118 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
23119 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
23120 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
23121 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
23122 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
23123 VkRenderPassCreateInfo rpci = {};
23124 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
23125 rpci.attachmentCount = 1;
23126 rpci.pAttachments = &attach_desc;
23127 rpci.subpassCount = 2;
23128 rpci.pSubpasses = subpasses;
23129
23130 // Now create RenderPass and verify no errors
23131 VkRenderPass rp;
23132 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
23133 m_errorMonitor->VerifyNotFound();
23134
23135 vkDestroyRenderPass(m_device->device(), rp, NULL);
23136}
23137
Tobin Ehlis01103de2017-02-16 13:22:47 -070023138TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
23139 TEST_DESCRIPTION(
23140 "Create a render pass with depth-stencil attachment where layout transition "
23141 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
23142 "transition has correctly occurred at queue submit time with no validation errors.");
23143
Tony Barbour1fa09702017-03-16 12:09:08 -060023144 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060023145 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070023146 if (!depth_format) {
23147 printf(" No Depth + Stencil format found. Skipped.\n");
23148 return;
23149 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070023150 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070023151 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023152 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
23153 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070023154 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070023155 return;
23156 }
23157
23158 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070023159 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23160
23161 // A renderpass with one depth/stencil attachment.
23162 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070023163 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023164 VK_SAMPLE_COUNT_1_BIT,
23165 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
23166 VK_ATTACHMENT_STORE_OP_DONT_CARE,
23167 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
23168 VK_ATTACHMENT_STORE_OP_DONT_CARE,
23169 VK_IMAGE_LAYOUT_UNDEFINED,
23170 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
23171
23172 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
23173
23174 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
23175
23176 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
23177
23178 VkRenderPass rp;
23179 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
23180 ASSERT_VK_SUCCESS(err);
23181 // A compatible ds image.
23182 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060023183 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 -070023184 ASSERT_TRUE(image.initialized());
23185
23186 VkImageViewCreateInfo ivci = {
23187 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
23188 nullptr,
23189 0,
23190 image.handle(),
23191 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070023192 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023193 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
23194 VK_COMPONENT_SWIZZLE_IDENTITY},
23195 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
23196 };
23197 VkImageView view;
23198 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
23199 ASSERT_VK_SUCCESS(err);
23200
23201 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
23202 VkFramebuffer fb;
23203 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
23204 ASSERT_VK_SUCCESS(err);
23205
23206 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
23207 m_commandBuffer->BeginCommandBuffer();
23208 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
23209 vkCmdEndRenderPass(m_commandBuffer->handle());
23210 m_commandBuffer->EndCommandBuffer();
23211 QueueCommandBuffer(false);
23212 m_errorMonitor->VerifyNotFound();
23213
23214 // Cleanup
23215 vkDestroyImageView(m_device->device(), view, NULL);
23216 vkDestroyRenderPass(m_device->device(), rp, NULL);
23217 vkDestroyFramebuffer(m_device->device(), fb, NULL);
23218}
23219
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023220TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023221 TEST_DESCRIPTION(
23222 "Test that pipeline validation accepts matrices passed "
23223 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023224 m_errorMonitor->ExpectSuccess();
23225
Tony Barbour1fa09702017-03-16 12:09:08 -060023226 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023227 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23228
23229 VkVertexInputBindingDescription input_binding;
23230 memset(&input_binding, 0, sizeof(input_binding));
23231
23232 VkVertexInputAttributeDescription input_attribs[2];
23233 memset(input_attribs, 0, sizeof(input_attribs));
23234
23235 for (int i = 0; i < 2; i++) {
23236 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23237 input_attribs[i].location = i;
23238 }
23239
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023240 char const *vsSource =
23241 "#version 450\n"
23242 "\n"
23243 "layout(location=0) in mat2x4 x;\n"
23244 "out gl_PerVertex {\n"
23245 " vec4 gl_Position;\n"
23246 "};\n"
23247 "void main(){\n"
23248 " gl_Position = x[0] + x[1];\n"
23249 "}\n";
23250 char const *fsSource =
23251 "#version 450\n"
23252 "\n"
23253 "layout(location=0) out vec4 color;\n"
23254 "void main(){\n"
23255 " color = vec4(1);\n"
23256 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023257
23258 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23259 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23260
23261 VkPipelineObj pipe(m_device);
23262 pipe.AddColorAttachment();
23263 pipe.AddShader(&vs);
23264 pipe.AddShader(&fs);
23265
23266 pipe.AddVertexInputBindings(&input_binding, 1);
23267 pipe.AddVertexInputAttribs(input_attribs, 2);
23268
23269 VkDescriptorSetObj descriptorSet(m_device);
23270 descriptorSet.AppendDummy();
23271 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23272
23273 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23274
23275 /* expect success */
23276 m_errorMonitor->VerifyNotFound();
23277}
23278
23279TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
23280 m_errorMonitor->ExpectSuccess();
23281
Tony Barbour1fa09702017-03-16 12:09:08 -060023282 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23284
23285 VkVertexInputBindingDescription input_binding;
23286 memset(&input_binding, 0, sizeof(input_binding));
23287
23288 VkVertexInputAttributeDescription input_attribs[2];
23289 memset(input_attribs, 0, sizeof(input_attribs));
23290
23291 for (int i = 0; i < 2; i++) {
23292 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23293 input_attribs[i].location = i;
23294 }
23295
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023296 char const *vsSource =
23297 "#version 450\n"
23298 "\n"
23299 "layout(location=0) in vec4 x[2];\n"
23300 "out gl_PerVertex {\n"
23301 " vec4 gl_Position;\n"
23302 "};\n"
23303 "void main(){\n"
23304 " gl_Position = x[0] + x[1];\n"
23305 "}\n";
23306 char const *fsSource =
23307 "#version 450\n"
23308 "\n"
23309 "layout(location=0) out vec4 color;\n"
23310 "void main(){\n"
23311 " color = vec4(1);\n"
23312 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023313
23314 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23315 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23316
23317 VkPipelineObj pipe(m_device);
23318 pipe.AddColorAttachment();
23319 pipe.AddShader(&vs);
23320 pipe.AddShader(&fs);
23321
23322 pipe.AddVertexInputBindings(&input_binding, 1);
23323 pipe.AddVertexInputAttribs(input_attribs, 2);
23324
23325 VkDescriptorSetObj descriptorSet(m_device);
23326 descriptorSet.AppendDummy();
23327 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23328
23329 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23330
23331 m_errorMonitor->VerifyNotFound();
23332}
23333
23334TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023335 TEST_DESCRIPTION(
23336 "Test that pipeline validation accepts consuming a vertex attribute "
23337 "through multiple vertex shader inputs, each consuming a different "
23338 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023339 m_errorMonitor->ExpectSuccess();
23340
Tony Barbour1fa09702017-03-16 12:09:08 -060023341 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023342 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23343
23344 VkVertexInputBindingDescription input_binding;
23345 memset(&input_binding, 0, sizeof(input_binding));
23346
23347 VkVertexInputAttributeDescription input_attribs[3];
23348 memset(input_attribs, 0, sizeof(input_attribs));
23349
23350 for (int i = 0; i < 3; i++) {
23351 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23352 input_attribs[i].location = i;
23353 }
23354
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023355 char const *vsSource =
23356 "#version 450\n"
23357 "\n"
23358 "layout(location=0) in vec4 x;\n"
23359 "layout(location=1) in vec3 y1;\n"
23360 "layout(location=1, component=3) in float y2;\n"
23361 "layout(location=2) in vec4 z;\n"
23362 "out gl_PerVertex {\n"
23363 " vec4 gl_Position;\n"
23364 "};\n"
23365 "void main(){\n"
23366 " gl_Position = x + vec4(y1, y2) + z;\n"
23367 "}\n";
23368 char const *fsSource =
23369 "#version 450\n"
23370 "\n"
23371 "layout(location=0) out vec4 color;\n"
23372 "void main(){\n"
23373 " color = vec4(1);\n"
23374 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023375
23376 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23377 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23378
23379 VkPipelineObj pipe(m_device);
23380 pipe.AddColorAttachment();
23381 pipe.AddShader(&vs);
23382 pipe.AddShader(&fs);
23383
23384 pipe.AddVertexInputBindings(&input_binding, 1);
23385 pipe.AddVertexInputAttribs(input_attribs, 3);
23386
23387 VkDescriptorSetObj descriptorSet(m_device);
23388 descriptorSet.AppendDummy();
23389 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23390
23391 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23392
23393 m_errorMonitor->VerifyNotFound();
23394}
23395
23396TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
23397 m_errorMonitor->ExpectSuccess();
23398
Tony Barbour1fa09702017-03-16 12:09:08 -060023399 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023400 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23401
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023402 char const *vsSource =
23403 "#version 450\n"
23404 "out gl_PerVertex {\n"
23405 " vec4 gl_Position;\n"
23406 "};\n"
23407 "void main(){\n"
23408 " gl_Position = vec4(0);\n"
23409 "}\n";
23410 char const *fsSource =
23411 "#version 450\n"
23412 "\n"
23413 "layout(location=0) out vec4 color;\n"
23414 "void main(){\n"
23415 " color = vec4(1);\n"
23416 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023417
23418 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23419 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23420
23421 VkPipelineObj pipe(m_device);
23422 pipe.AddColorAttachment();
23423 pipe.AddShader(&vs);
23424 pipe.AddShader(&fs);
23425
23426 VkDescriptorSetObj descriptorSet(m_device);
23427 descriptorSet.AppendDummy();
23428 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23429
23430 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23431
23432 m_errorMonitor->VerifyNotFound();
23433}
23434
23435TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023436 TEST_DESCRIPTION(
23437 "Test that pipeline validation accepts the relaxed type matching rules "
23438 "set out in 14.1.3: fundamental type must match, and producer side must "
23439 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023440 m_errorMonitor->ExpectSuccess();
23441
23442 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
23443
Tony Barbour1fa09702017-03-16 12:09:08 -060023444 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23446
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023447 char const *vsSource =
23448 "#version 450\n"
23449 "out gl_PerVertex {\n"
23450 " vec4 gl_Position;\n"
23451 "};\n"
23452 "layout(location=0) out vec3 x;\n"
23453 "layout(location=1) out ivec3 y;\n"
23454 "layout(location=2) out vec3 z;\n"
23455 "void main(){\n"
23456 " gl_Position = vec4(0);\n"
23457 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
23458 "}\n";
23459 char const *fsSource =
23460 "#version 450\n"
23461 "\n"
23462 "layout(location=0) out vec4 color;\n"
23463 "layout(location=0) in float x;\n"
23464 "layout(location=1) flat in int y;\n"
23465 "layout(location=2) in vec2 z;\n"
23466 "void main(){\n"
23467 " color = vec4(1 + x + y + z.x);\n"
23468 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023469
23470 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23471 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23472
23473 VkPipelineObj pipe(m_device);
23474 pipe.AddColorAttachment();
23475 pipe.AddShader(&vs);
23476 pipe.AddShader(&fs);
23477
23478 VkDescriptorSetObj descriptorSet(m_device);
23479 descriptorSet.AppendDummy();
23480 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23481
23482 VkResult err = VK_SUCCESS;
23483 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23484 ASSERT_VK_SUCCESS(err);
23485
23486 m_errorMonitor->VerifyNotFound();
23487}
23488
23489TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023490 TEST_DESCRIPTION(
23491 "Test that pipeline validation accepts per-vertex variables "
23492 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023493 m_errorMonitor->ExpectSuccess();
23494
Tony Barbour1fa09702017-03-16 12:09:08 -060023495 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023496 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23497
23498 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023499 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023500 return;
23501 }
23502
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023503 char const *vsSource =
23504 "#version 450\n"
23505 "void main(){}\n";
23506 char const *tcsSource =
23507 "#version 450\n"
23508 "layout(location=0) out int x[];\n"
23509 "layout(vertices=3) out;\n"
23510 "void main(){\n"
23511 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
23512 " gl_TessLevelInner[0] = 1;\n"
23513 " x[gl_InvocationID] = gl_InvocationID;\n"
23514 "}\n";
23515 char const *tesSource =
23516 "#version 450\n"
23517 "layout(triangles, equal_spacing, cw) in;\n"
23518 "layout(location=0) in int x[];\n"
23519 "out gl_PerVertex { vec4 gl_Position; };\n"
23520 "void main(){\n"
23521 " gl_Position.xyz = gl_TessCoord;\n"
23522 " gl_Position.w = x[0] + x[1] + x[2];\n"
23523 "}\n";
23524 char const *fsSource =
23525 "#version 450\n"
23526 "layout(location=0) out vec4 color;\n"
23527 "void main(){\n"
23528 " color = vec4(1);\n"
23529 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023530
23531 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23532 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
23533 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
23534 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23535
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023536 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
23537 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023538
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023539 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023540
23541 VkPipelineObj pipe(m_device);
23542 pipe.SetInputAssembly(&iasci);
23543 pipe.SetTessellation(&tsci);
23544 pipe.AddColorAttachment();
23545 pipe.AddShader(&vs);
23546 pipe.AddShader(&tcs);
23547 pipe.AddShader(&tes);
23548 pipe.AddShader(&fs);
23549
23550 VkDescriptorSetObj descriptorSet(m_device);
23551 descriptorSet.AppendDummy();
23552 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23553
23554 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23555
23556 m_errorMonitor->VerifyNotFound();
23557}
23558
23559TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023560 TEST_DESCRIPTION(
23561 "Test that pipeline validation accepts a user-defined "
23562 "interface block passed into the geometry shader. This "
23563 "is interesting because the 'extra' array level is not "
23564 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023565 m_errorMonitor->ExpectSuccess();
23566
Tony Barbour1fa09702017-03-16 12:09:08 -060023567 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023568 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23569
23570 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023571 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023572 return;
23573 }
23574
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023575 char const *vsSource =
23576 "#version 450\n"
23577 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
23578 "void main(){\n"
23579 " vs_out.x = vec4(1);\n"
23580 "}\n";
23581 char const *gsSource =
23582 "#version 450\n"
23583 "layout(triangles) in;\n"
23584 "layout(triangle_strip, max_vertices=3) out;\n"
23585 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
23586 "out gl_PerVertex { vec4 gl_Position; };\n"
23587 "void main() {\n"
23588 " gl_Position = gs_in[0].x;\n"
23589 " EmitVertex();\n"
23590 "}\n";
23591 char const *fsSource =
23592 "#version 450\n"
23593 "layout(location=0) out vec4 color;\n"
23594 "void main(){\n"
23595 " color = vec4(1);\n"
23596 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023597
23598 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23599 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
23600 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23601
23602 VkPipelineObj pipe(m_device);
23603 pipe.AddColorAttachment();
23604 pipe.AddShader(&vs);
23605 pipe.AddShader(&gs);
23606 pipe.AddShader(&fs);
23607
23608 VkDescriptorSetObj descriptorSet(m_device);
23609 descriptorSet.AppendDummy();
23610 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23611
23612 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23613
23614 m_errorMonitor->VerifyNotFound();
23615}
23616
23617TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023618 TEST_DESCRIPTION(
23619 "Test that pipeline validation accepts basic use of 64bit vertex "
23620 "attributes. This is interesting because they consume multiple "
23621 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023622 m_errorMonitor->ExpectSuccess();
23623
Tony Barbour1fa09702017-03-16 12:09:08 -060023624 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023625 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23626
23627 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023628 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023629 return;
23630 }
23631
23632 VkVertexInputBindingDescription input_bindings[1];
23633 memset(input_bindings, 0, sizeof(input_bindings));
23634
23635 VkVertexInputAttributeDescription input_attribs[4];
23636 memset(input_attribs, 0, sizeof(input_attribs));
23637 input_attribs[0].location = 0;
23638 input_attribs[0].offset = 0;
23639 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23640 input_attribs[1].location = 2;
23641 input_attribs[1].offset = 32;
23642 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23643 input_attribs[2].location = 4;
23644 input_attribs[2].offset = 64;
23645 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23646 input_attribs[3].location = 6;
23647 input_attribs[3].offset = 96;
23648 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23649
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023650 char const *vsSource =
23651 "#version 450\n"
23652 "\n"
23653 "layout(location=0) in dmat4 x;\n"
23654 "out gl_PerVertex {\n"
23655 " vec4 gl_Position;\n"
23656 "};\n"
23657 "void main(){\n"
23658 " gl_Position = vec4(x[0][0]);\n"
23659 "}\n";
23660 char const *fsSource =
23661 "#version 450\n"
23662 "\n"
23663 "layout(location=0) out vec4 color;\n"
23664 "void main(){\n"
23665 " color = vec4(1);\n"
23666 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023667
23668 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23669 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23670
23671 VkPipelineObj pipe(m_device);
23672 pipe.AddColorAttachment();
23673 pipe.AddShader(&vs);
23674 pipe.AddShader(&fs);
23675
23676 pipe.AddVertexInputBindings(input_bindings, 1);
23677 pipe.AddVertexInputAttribs(input_attribs, 4);
23678
23679 VkDescriptorSetObj descriptorSet(m_device);
23680 descriptorSet.AppendDummy();
23681 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23682
23683 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23684
23685 m_errorMonitor->VerifyNotFound();
23686}
23687
23688TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
23689 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
23690 m_errorMonitor->ExpectSuccess();
23691
Tony Barbour1fa09702017-03-16 12:09:08 -060023692 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023693
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023694 char const *vsSource =
23695 "#version 450\n"
23696 "\n"
23697 "out gl_PerVertex {\n"
23698 " vec4 gl_Position;\n"
23699 "};\n"
23700 "void main(){\n"
23701 " gl_Position = vec4(1);\n"
23702 "}\n";
23703 char const *fsSource =
23704 "#version 450\n"
23705 "\n"
23706 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
23707 "layout(location=0) out vec4 color;\n"
23708 "void main() {\n"
23709 " color = subpassLoad(x);\n"
23710 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023711
23712 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23713 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23714
23715 VkPipelineObj pipe(m_device);
23716 pipe.AddShader(&vs);
23717 pipe.AddShader(&fs);
23718 pipe.AddColorAttachment();
23719 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23720
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023721 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
23722 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023723 VkDescriptorSetLayout dsl;
23724 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23725 ASSERT_VK_SUCCESS(err);
23726
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023727 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023728 VkPipelineLayout pl;
23729 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23730 ASSERT_VK_SUCCESS(err);
23731
23732 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023733 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
23734 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
23735 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
23736 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
23737 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 -060023738 };
23739 VkAttachmentReference color = {
23740 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
23741 };
23742 VkAttachmentReference input = {
23743 1, VK_IMAGE_LAYOUT_GENERAL,
23744 };
23745
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023746 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023747
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023748 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023749 VkRenderPass rp;
23750 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
23751 ASSERT_VK_SUCCESS(err);
23752
23753 // should be OK. would go wrong here if it's going to...
23754 pipe.CreateVKPipeline(pl, rp);
23755
23756 m_errorMonitor->VerifyNotFound();
23757
23758 vkDestroyRenderPass(m_device->device(), rp, nullptr);
23759 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23760 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23761}
23762
23763TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023764 TEST_DESCRIPTION(
23765 "Test that pipeline validation accepts a compute pipeline which declares a "
23766 "descriptor-backed resource which is not provided, but the shader does not "
23767 "statically use it. This is interesting because it requires compute pipelines "
23768 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023769 m_errorMonitor->ExpectSuccess();
23770
Tony Barbour1fa09702017-03-16 12:09:08 -060023771 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023772
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023773 char const *csSource =
23774 "#version 450\n"
23775 "\n"
23776 "layout(local_size_x=1) in;\n"
23777 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
23778 "void main(){\n"
23779 " // x is not used.\n"
23780 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023781
23782 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23783
23784 VkDescriptorSetObj descriptorSet(m_device);
23785 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23786
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023787 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23788 nullptr,
23789 0,
23790 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23791 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23792 descriptorSet.GetPipelineLayout(),
23793 VK_NULL_HANDLE,
23794 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023795
23796 VkPipeline pipe;
23797 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23798
23799 m_errorMonitor->VerifyNotFound();
23800
23801 if (err == VK_SUCCESS) {
23802 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23803 }
23804}
23805
23806TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023807 TEST_DESCRIPTION(
23808 "Test that pipeline validation accepts a shader consuming only the "
23809 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023810 m_errorMonitor->ExpectSuccess();
23811
Tony Barbour1fa09702017-03-16 12:09:08 -060023812 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023813
23814 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023815 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23816 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23817 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023818 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023819 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023820 VkDescriptorSetLayout dsl;
23821 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23822 ASSERT_VK_SUCCESS(err);
23823
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023824 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023825 VkPipelineLayout pl;
23826 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23827 ASSERT_VK_SUCCESS(err);
23828
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023829 char const *csSource =
23830 "#version 450\n"
23831 "\n"
23832 "layout(local_size_x=1) in;\n"
23833 "layout(set=0, binding=0) uniform sampler s;\n"
23834 "layout(set=0, binding=1) uniform texture2D t;\n"
23835 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
23836 "void main() {\n"
23837 " x = texture(sampler2D(t, s), vec2(0));\n"
23838 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023839 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23840
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023841 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23842 nullptr,
23843 0,
23844 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23845 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23846 pl,
23847 VK_NULL_HANDLE,
23848 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023849
23850 VkPipeline pipe;
23851 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23852
23853 m_errorMonitor->VerifyNotFound();
23854
23855 if (err == VK_SUCCESS) {
23856 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23857 }
23858
23859 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23860 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23861}
23862
23863TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023864 TEST_DESCRIPTION(
23865 "Test that pipeline validation accepts a shader consuming only the "
23866 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023867 m_errorMonitor->ExpectSuccess();
23868
Tony Barbour1fa09702017-03-16 12:09:08 -060023869 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023870
23871 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023872 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23873 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23874 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023875 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023876 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023877 VkDescriptorSetLayout dsl;
23878 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23879 ASSERT_VK_SUCCESS(err);
23880
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023881 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023882 VkPipelineLayout pl;
23883 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23884 ASSERT_VK_SUCCESS(err);
23885
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023886 char const *csSource =
23887 "#version 450\n"
23888 "\n"
23889 "layout(local_size_x=1) in;\n"
23890 "layout(set=0, binding=0) uniform texture2D t;\n"
23891 "layout(set=0, binding=1) uniform sampler s;\n"
23892 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
23893 "void main() {\n"
23894 " x = texture(sampler2D(t, s), vec2(0));\n"
23895 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023896 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23897
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023898 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23899 nullptr,
23900 0,
23901 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23902 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23903 pl,
23904 VK_NULL_HANDLE,
23905 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023906
23907 VkPipeline pipe;
23908 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23909
23910 m_errorMonitor->VerifyNotFound();
23911
23912 if (err == VK_SUCCESS) {
23913 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23914 }
23915
23916 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23917 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23918}
23919
23920TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023921 TEST_DESCRIPTION(
23922 "Test that pipeline validation accepts a shader consuming "
23923 "both the sampler and the image of a combined image+sampler "
23924 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023925 m_errorMonitor->ExpectSuccess();
23926
Tony Barbour1fa09702017-03-16 12:09:08 -060023927 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023928
23929 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023930 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23931 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023932 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023933 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023934 VkDescriptorSetLayout dsl;
23935 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23936 ASSERT_VK_SUCCESS(err);
23937
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023938 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023939 VkPipelineLayout pl;
23940 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23941 ASSERT_VK_SUCCESS(err);
23942
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023943 char const *csSource =
23944 "#version 450\n"
23945 "\n"
23946 "layout(local_size_x=1) in;\n"
23947 "layout(set=0, binding=0) uniform texture2D t;\n"
23948 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
23949 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
23950 "void main() {\n"
23951 " x = texture(sampler2D(t, s), vec2(0));\n"
23952 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023953 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23954
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023955 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23956 nullptr,
23957 0,
23958 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23959 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23960 pl,
23961 VK_NULL_HANDLE,
23962 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023963
23964 VkPipeline pipe;
23965 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23966
23967 m_errorMonitor->VerifyNotFound();
23968
23969 if (err == VK_SUCCESS) {
23970 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23971 }
23972
23973 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23974 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23975}
23976
Tony Barbour3ed87a02017-03-15 16:19:02 -060023977TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023978 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23979
Tony Barbour3ed87a02017-03-15 16:19:02 -060023980 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023981 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023982
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023983 // Ensure that extension is available and enabled.
23984 uint32_t extension_count = 0;
23985 bool supports_maintenance1_extension = false;
23986 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23987 ASSERT_VK_SUCCESS(err);
23988 if (extension_count > 0) {
23989 std::vector<VkExtensionProperties> available_extensions(extension_count);
23990
23991 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23992 ASSERT_VK_SUCCESS(err);
23993 for (const auto &extension_props : available_extensions) {
23994 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23995 supports_maintenance1_extension = true;
23996 }
23997 }
23998 }
23999
24000 // Proceed if extension is supported by hardware
24001 if (!supports_maintenance1_extension) {
24002 printf(" Maintenance1 Extension not supported, skipping tests\n");
24003 return;
24004 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060024005
24006 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060024007 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060024008 VkCommandBuffer cmd_buf;
24009 VkCommandBufferAllocateInfo alloc_info;
24010 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
24011 alloc_info.pNext = NULL;
24012 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070024013 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060024014 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
24015 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
24016
24017 VkCommandBufferBeginInfo cb_binfo;
24018 cb_binfo.pNext = NULL;
24019 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
24020 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
24021 cb_binfo.flags = 0;
24022 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
24023 // Set Negative height, should give error if Maintenance 1 is not enabled
24024 VkViewport viewport = {0, 0, 16, -16, 0, 1};
24025 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
24026 vkEndCommandBuffer(cmd_buf);
24027
24028 m_errorMonitor->VerifyNotFound();
24029}
24030
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060024031TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
24032 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
24033
24034 ASSERT_NO_FATAL_FAILURE(Init());
24035
24036 uint32_t extension_count = 0;
24037 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
24038 ASSERT_VK_SUCCESS(err);
24039
24040 if (extension_count > 0) {
24041 std::vector<VkExtensionProperties> available_extensions(extension_count);
24042 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
24043 ASSERT_VK_SUCCESS(err);
24044
24045 for (const auto &extension_props : available_extensions) {
24046 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
24047 // Create two pNext structures which by themselves would be valid
24048 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
24049 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
24050 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
24051 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
24052 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
24053
24054 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
24055 dedicated_buffer_create_info_2.pNext = nullptr;
24056 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
24057
24058 uint32_t queue_family_index = 0;
24059 VkBufferCreateInfo buffer_create_info = {};
24060 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
24061 buffer_create_info.pNext = &dedicated_buffer_create_info;
24062 buffer_create_info.size = 1024;
24063 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
24064 buffer_create_info.queueFamilyIndexCount = 1;
24065 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
24066
24067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
24068 VkBuffer buffer;
24069 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
24070 m_errorMonitor->VerifyFound();
24071 }
24072 }
24073 }
24074}
24075
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024076TEST_F(VkPositiveLayerTest, ValidStructPNext) {
24077 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
24078
Tony Barbour1fa09702017-03-16 12:09:08 -060024079 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024080
24081 // Positive test to check parameter_validation and unique_objects support
24082 // for NV_dedicated_allocation
24083 uint32_t extension_count = 0;
24084 bool supports_nv_dedicated_allocation = false;
24085 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
24086 ASSERT_VK_SUCCESS(err);
24087
24088 if (extension_count > 0) {
24089 std::vector<VkExtensionProperties> available_extensions(extension_count);
24090
24091 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
24092 ASSERT_VK_SUCCESS(err);
24093
24094 for (const auto &extension_props : available_extensions) {
24095 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
24096 supports_nv_dedicated_allocation = true;
24097 }
24098 }
24099 }
24100
24101 if (supports_nv_dedicated_allocation) {
24102 m_errorMonitor->ExpectSuccess();
24103
24104 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
24105 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
24106 dedicated_buffer_create_info.pNext = nullptr;
24107 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
24108
24109 uint32_t queue_family_index = 0;
24110 VkBufferCreateInfo buffer_create_info = {};
24111 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
24112 buffer_create_info.pNext = &dedicated_buffer_create_info;
24113 buffer_create_info.size = 1024;
24114 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
24115 buffer_create_info.queueFamilyIndexCount = 1;
24116 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
24117
24118 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070024119 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024120 ASSERT_VK_SUCCESS(err);
24121
24122 VkMemoryRequirements memory_reqs;
24123 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
24124
24125 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
24126 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
24127 dedicated_memory_info.pNext = nullptr;
24128 dedicated_memory_info.buffer = buffer;
24129 dedicated_memory_info.image = VK_NULL_HANDLE;
24130
24131 VkMemoryAllocateInfo memory_info = {};
24132 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
24133 memory_info.pNext = &dedicated_memory_info;
24134 memory_info.allocationSize = memory_reqs.size;
24135
24136 bool pass;
24137 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
24138 ASSERT_TRUE(pass);
24139
24140 VkDeviceMemory buffer_memory;
24141 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
24142 ASSERT_VK_SUCCESS(err);
24143
24144 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
24145 ASSERT_VK_SUCCESS(err);
24146
24147 vkDestroyBuffer(m_device->device(), buffer, NULL);
24148 vkFreeMemory(m_device->device(), buffer_memory, NULL);
24149
24150 m_errorMonitor->VerifyNotFound();
24151 }
24152}
24153
24154TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
24155 VkResult err;
24156
24157 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
24158
Tony Barbour1fa09702017-03-16 12:09:08 -060024159 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024160 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
24161
24162 std::vector<const char *> device_extension_names;
24163 auto features = m_device->phy().features();
24164 // Artificially disable support for non-solid fill modes
24165 features.fillModeNonSolid = false;
24166 // The sacrificial device object
24167 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
24168
24169 VkRenderpassObj render_pass(&test_device);
24170
24171 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
24172 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
24173 pipeline_layout_ci.setLayoutCount = 0;
24174 pipeline_layout_ci.pSetLayouts = NULL;
24175
24176 VkPipelineLayout pipeline_layout;
24177 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
24178 ASSERT_VK_SUCCESS(err);
24179
24180 VkPipelineRasterizationStateCreateInfo rs_ci = {};
24181 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
24182 rs_ci.pNext = nullptr;
24183 rs_ci.lineWidth = 1.0f;
24184 rs_ci.rasterizerDiscardEnable = true;
24185
24186 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
24187 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
24188
24189 // Set polygonMode=FILL. No error is expected
24190 m_errorMonitor->ExpectSuccess();
24191 {
24192 VkPipelineObj pipe(&test_device);
24193 pipe.AddShader(&vs);
24194 pipe.AddShader(&fs);
24195 pipe.AddColorAttachment();
24196 // Set polygonMode to a good value
24197 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
24198 pipe.SetRasterization(&rs_ci);
24199 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
24200 }
24201 m_errorMonitor->VerifyNotFound();
24202
24203 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
24204}
24205
Dave Houlton1150cf52017-04-27 14:38:11 -060024206TEST_F(VkPositiveLayerTest, LongSemaphoreChain) {
Chris Forbes94196952017-04-06 16:30:59 -070024207 m_errorMonitor->ExpectSuccess();
24208
24209 ASSERT_NO_FATAL_FAILURE(Init());
24210 VkResult err;
24211
24212 std::vector<VkSemaphore> semaphores;
24213
24214 const int chainLength = 32768;
24215 VkPipelineStageFlags flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
24216
24217 for (int i = 0; i < chainLength; i++) {
Dave Houlton1150cf52017-04-27 14:38:11 -060024218 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024219 VkSemaphore semaphore;
24220 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &semaphore);
24221 ASSERT_VK_SUCCESS(err);
24222
24223 semaphores.push_back(semaphore);
24224
Chris Forbesfc50aaa2017-05-01 10:20:17 -070024225 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO,
24226 nullptr,
24227 semaphores.size() > 1 ? 1u : 0u,
24228 semaphores.size() > 1 ? &semaphores[semaphores.size() - 2] : nullptr,
24229 &flags,
24230 0,
24231 nullptr,
24232 1,
24233 &semaphores[semaphores.size() - 1]};
Chris Forbes94196952017-04-06 16:30:59 -070024234 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
24235 ASSERT_VK_SUCCESS(err);
24236 }
24237
Dave Houlton1150cf52017-04-27 14:38:11 -060024238 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024239 VkFence fence;
24240 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24241 ASSERT_VK_SUCCESS(err);
Dave Houlton1150cf52017-04-27 14:38:11 -060024242 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &semaphores.back(), &flags, 0, nullptr, 0, nullptr};
Chris Forbes94196952017-04-06 16:30:59 -070024243 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24244 ASSERT_VK_SUCCESS(err);
24245
24246 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
24247
Dave Houlton1150cf52017-04-27 14:38:11 -060024248 for (auto semaphore : semaphores) vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Chris Forbes94196952017-04-06 16:30:59 -070024249
24250 vkDestroyFence(m_device->device(), fence, nullptr);
24251
24252 m_errorMonitor->VerifyNotFound();
24253}
24254
Mike Stroyanca855662017-05-02 11:06:27 -060024255extern "C" void *ReleaseNullFence(void *arg) {
24256 struct thread_data_struct *data = (struct thread_data_struct *)arg;
24257
24258 for (int i = 0; i < 40000; i++) {
24259 vkDestroyFence(data->device, VK_NULL_HANDLE, NULL);
24260 if (data->bailout) {
24261 break;
24262 }
24263 }
24264 return NULL;
24265}
24266
24267TEST_F(VkPositiveLayerTest, ThreadNullFenceCollision) {
24268 test_platform_thread thread;
24269
24270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
24271
24272 ASSERT_NO_FATAL_FAILURE(Init());
24273
24274 struct thread_data_struct data;
24275 data.device = m_device->device();
24276 data.bailout = false;
24277 m_errorMonitor->SetBailout(&data.bailout);
24278
24279 // Call vkDestroyFence of VK_NULL_HANDLE repeatedly using multiple threads.
24280 // There should be no validation error from collision of that non-object.
24281 test_platform_thread_create(&thread, ReleaseNullFence, (void *)&data);
24282 for (int i = 0; i < 40000; i++) {
24283 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
24284 }
24285 test_platform_thread_join(thread, NULL);
24286
24287 m_errorMonitor->SetBailout(NULL);
24288
24289 m_errorMonitor->VerifyNotFound();
24290}
24291
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024292#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024293TEST_F(VkPositiveLayerTest, LongFenceChain)
24294{
24295 m_errorMonitor->ExpectSuccess();
24296
Tony Barbour1fa09702017-03-16 12:09:08 -060024297 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024298 VkResult err;
24299
24300 std::vector<VkFence> fences;
24301
24302 const int chainLength = 32768;
24303
24304 for (int i = 0; i < chainLength; i++) {
24305 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
24306 VkFence fence;
24307 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24308 ASSERT_VK_SUCCESS(err);
24309
24310 fences.push_back(fence);
24311
24312 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
24313 0, nullptr, 0, nullptr };
24314 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24315 ASSERT_VK_SUCCESS(err);
24316
24317 }
24318
24319 // BOOM, stack overflow.
24320 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
24321
24322 for (auto fence : fences)
24323 vkDestroyFence(m_device->device(), fence, nullptr);
24324
24325 m_errorMonitor->VerifyNotFound();
24326}
24327#endif
24328
Cody Northrop1242dfd2016-07-13 17:24:59 -060024329#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060024330const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060024331static bool initialized = false;
24332static bool active = false;
24333
24334// Convert Intents to argv
24335// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024336std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024337 std::vector<std::string> args;
24338 JavaVM &vm = *app.activity->vm;
24339 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024340 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024341
24342 JNIEnv &env = *p_env;
24343 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024344 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024345 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024346 jmethodID get_string_extra_method =
24347 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024348 jvalue get_string_extra_args;
24349 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024350 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060024351
24352 std::string args_str;
24353 if (extra_str) {
24354 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
24355 args_str = extra_utf;
24356 env.ReleaseStringUTFChars(extra_str, extra_utf);
24357 env.DeleteLocalRef(extra_str);
24358 }
24359
24360 env.DeleteLocalRef(get_string_extra_args.l);
24361 env.DeleteLocalRef(intent);
24362 vm.DetachCurrentThread();
24363
24364 // split args_str
24365 std::stringstream ss(args_str);
24366 std::string arg;
24367 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024368 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024369 }
24370
24371 return args;
24372}
24373
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024374void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
24375 const char *const type_param = test_info.type_param();
24376 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060024377
24378 if (type_param != NULL || value_param != NULL) {
24379 error_message.append(", where ");
24380 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024381 error_message.append("TypeParam = ").append(type_param);
24382 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060024383 }
24384 if (value_param != NULL) {
24385 error_message.append("GetParam() = ").append(value_param);
24386 }
24387 }
24388}
24389
24390// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
24391class LogcatPrinter : public ::testing::EmptyTestEventListener {
24392 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024393 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024394 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
24395 }
24396
24397 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024398 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060024399 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024400 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060024401
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024402 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
24403 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060024404 }
24405
24406 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024407 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024408 std::string result;
24409 if (info.result()->Passed()) {
24410 result.append("[ OK ]");
24411 } else {
24412 result.append("[ FAILED ]");
24413 }
24414 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024415 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060024416
24417 if (::testing::GTEST_FLAG(print_time)) {
24418 std::ostringstream os;
24419 os << info.result()->elapsed_time();
24420 result.append(" (").append(os.str()).append(" ms)");
24421 }
24422
24423 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
24424 };
24425};
24426
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024427static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024428
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024429static void processCommand(struct android_app *app, int32_t cmd) {
24430 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024431 case APP_CMD_INIT_WINDOW: {
24432 if (app->window) {
24433 initialized = true;
24434 }
24435 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024436 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024437 case APP_CMD_GAINED_FOCUS: {
24438 active = true;
24439 break;
24440 }
24441 case APP_CMD_LOST_FOCUS: {
24442 active = false;
24443 break;
24444 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024445 }
24446}
24447
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024448void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024449 app_dummy();
24450
Cody Northrop1242dfd2016-07-13 17:24:59 -060024451 int vulkanSupport = InitVulkan();
24452 if (vulkanSupport == 0) {
24453 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
24454 return;
24455 }
24456
24457 app->onAppCmd = processCommand;
24458 app->onInputEvent = processInput;
24459
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024460 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024461 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024462 struct android_poll_source *source;
24463 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024464 if (source) {
24465 source->process(app, source);
24466 }
24467
24468 if (app->destroyRequested != 0) {
24469 VkTestFramework::Finish();
24470 return;
24471 }
24472 }
24473
24474 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024475 // Use the following key to send arguments to gtest, i.e.
24476 // --es args "--gtest_filter=-VkLayerTest.foo"
24477 const char key[] = "args";
24478 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024479
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024480 std::string filter = "";
24481 if (args.size() > 0) {
24482 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
24483 filter += args[0];
24484 } else {
24485 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
24486 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024487
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024488 int argc = 2;
24489 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
24490 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024491
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024492 // Route output to files until we can override the gtest output
24493 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
24494 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024495
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024496 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060024497
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024498 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060024499 listeners.Append(new LogcatPrinter);
24500
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024501 VkTestFramework::InitArgs(&argc, argv);
24502 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024503
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024504 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024505
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024506 if (result != 0) {
24507 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
24508 } else {
24509 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
24510 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024511
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024512 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024513
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024514 fclose(stdout);
24515 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024516
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024517 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024518 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024519 }
24520 }
24521}
24522#endif
24523
Tony Barbour300a6082015-04-07 13:44:53 -060024524int main(int argc, char **argv) {
24525 int result;
24526
Cody Northrop8e54a402016-03-08 22:25:52 -070024527#ifdef ANDROID
24528 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024529 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070024530#endif
24531
Tony Barbour300a6082015-04-07 13:44:53 -060024532 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060024533 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060024534
24535 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
24536
24537 result = RUN_ALL_TESTS();
24538
Tony Barbour6918cd52015-04-09 12:58:51 -060024539 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060024540 return result;
24541}