blob: 0dabef9e34545f3a4597677f229bc17e3738483a [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Dave Houltonc85c4a82017-04-25 15:56:45 -0600341#ifdef _DEBUG
342 char embedded_code_string[2048];
343 snprintf(embedded_code_string, 2048, "%s [%05d]", pMsg, msgCode);
344 return errMonitor->CheckForDesiredMsg(msgCode, embedded_code_string);
345#else
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600346 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Dave Houltonc85c4a82017-04-25 15:56:45 -0600347#endif
Tony Barbour0b4d9562015-04-09 10:48:04 -0600348 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600349 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600350}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500351
Karl Schultz6addd812016-02-02 17:17:23 -0700352class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700353 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600354 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
355 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700356 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600357 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
358 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700359 }
Tony Barbour300a6082015-04-07 13:44:53 -0600360
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600361 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
362 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700363 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600364 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700365 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600366 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700367 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600368 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
369 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
370 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700371 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
372 }
373 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
374 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
375 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600376 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
378 InitState(features, flags);
379 }
380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700381 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700382 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600384 std::vector<const char *> instance_layer_names;
385 std::vector<const char *> instance_extension_names;
386 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600387
388 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700389 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600390 /*
391 * Since CreateDbgMsgCallback is an instance level extension call
392 * any extension / layer that utilizes that feature also needs
393 * to be enabled at create instance time.
394 */
Karl Schultz6addd812016-02-02 17:17:23 -0700395 // Use Threading layer first to protect others from
396 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700397 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600398 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800399 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700400 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600401 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700402 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600403
Ian Elliott2c1daf52016-05-12 09:41:46 -0600404 if (m_enableWSI) {
405 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
406 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
407#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
408#if defined(VK_USE_PLATFORM_ANDROID_KHR)
409 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_MIR_KHR)
412 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600414#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
415 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700416#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600417#if defined(VK_USE_PLATFORM_WIN32_KHR)
418 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_WIN32_KHR
420#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600421#if defined(VK_USE_PLATFORM_XCB_KHR)
422 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
423#elif defined(VK_USE_PLATFORM_XLIB_KHR)
424 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700425#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600426 }
427
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600428 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600429 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800430 this->app_info.pApplicationName = "layer_tests";
431 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600432 this->app_info.pEngineName = "unittest";
433 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600434 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600435
Tony Barbour15524c32015-04-29 17:34:29 -0600436 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
438
439 virtual void TearDown() {
440 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600441 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600442 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600443 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600444
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600445 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600446};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500447
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600448void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449 // Create identity matrix
450 int i;
451 struct vktriangle_vs_uniform data;
452
453 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700454 glm::mat4 View = glm::mat4(1.0f);
455 glm::mat4 Model = glm::mat4(1.0f);
456 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700458 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
460 memcpy(&data.mvp, &MVP[0][0], matrixSize);
461
Karl Schultz6addd812016-02-02 17:17:23 -0700462 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600463 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500464 };
465
Karl Schultz6addd812016-02-02 17:17:23 -0700466 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 data.position[i][0] = tri_data[i].posX;
468 data.position[i][1] = tri_data[i].posY;
469 data.position[i][2] = tri_data[i].posZ;
470 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700471 data.color[i][0] = tri_data[i].r;
472 data.color[i][1] = tri_data[i].g;
473 data.color[i][2] = tri_data[i].b;
474 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475 }
476
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477 ASSERT_NO_FATAL_FAILURE(InitViewport());
478
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200479 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
480 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Karl Schultz6addd812016-02-02 17:17:23 -0700482 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600483 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484
485 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800486 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500487 pipelineobj.AddShader(&vs);
488 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 if (failMask & BsoFailLineWidth) {
490 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600491 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600492 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
494 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600495 }
496 if (failMask & BsoFailDepthBias) {
497 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600498 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600499 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600500 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600501 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600502 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600503 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700504 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700505 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600506 if (failMask & BsoFailViewport) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
508 }
509 if (failMask & BsoFailScissor) {
510 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
511 }
512 if (failMask & BsoFailBlend) {
513 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600514 VkPipelineColorBlendAttachmentState att_state = {};
515 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
516 att_state.blendEnable = VK_TRUE;
517 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600518 }
519 if (failMask & BsoFailDepthBounds) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
521 }
522 if (failMask & BsoFailStencilReadMask) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
524 }
525 if (failMask & BsoFailStencilWriteMask) {
526 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
527 }
528 if (failMask & BsoFailStencilReference) {
529 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
530 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500531
532 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600533 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700536 m_commandBuffer->BeginCommandBuffer();
537 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538
Tony Barbourfe3351b2015-07-28 10:17:20 -0600539 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500540
541 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600542 if (failMask & BsoFailIndexBuffer) {
543 // Use DrawIndexed w/o an index buffer bound
544 DrawIndexed(3, 1, 0, 0, 0);
545 } else {
546 Draw(3, 1, 0, 0);
547 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500548
Mark Muellerd4914412016-06-13 17:52:06 -0600549 if (failMask & BsoFailCmdClearAttachments) {
550 VkClearAttachment color_attachment = {};
551 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700552 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600553 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
554
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600555 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600556 }
557
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500558 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700559 m_commandBuffer->EndRenderPass();
560 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600561 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562}
563
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600564void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
565 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500566 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600567 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500568 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600569 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500570 }
571
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800572 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700573 // Make sure depthWriteEnable is set so that Depth fail test will work
574 // correctly
575 // Make sure stencilTestEnable is set so that Stencil fail test will work
576 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600577 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800578 stencil.failOp = VK_STENCIL_OP_KEEP;
579 stencil.passOp = VK_STENCIL_OP_KEEP;
580 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
581 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600582
583 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
584 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600585 ds_ci.pNext = NULL;
586 ds_ci.depthTestEnable = VK_FALSE;
587 ds_ci.depthWriteEnable = VK_TRUE;
588 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
589 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600590 if (failMask & BsoFailDepthBounds) {
591 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600592 ds_ci.maxDepthBounds = 0.0f;
593 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600594 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600595 ds_ci.stencilTestEnable = VK_TRUE;
596 ds_ci.front = stencil;
597 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600598
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600599 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600600 pipelineobj.SetViewport(m_viewports);
601 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800602 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600603 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600604 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 commandBuffer->BindPipeline(pipelineobj);
606 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500607}
608
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600609class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700610 public:
611 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600612};
613
Ian Elliott2c1daf52016-05-12 09:41:46 -0600614class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
616 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600617 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600618};
619
Mark Muellerdfe37552016-07-07 14:47:42 -0600620class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700621 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600622 enum eTestEnFlags {
623 eDoubleDelete,
624 eInvalidDeviceOffset,
625 eInvalidMemoryOffset,
626 eBindNullBuffer,
627 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600628 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 };
630
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600631 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600632
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
634 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635 return true;
636 }
637 VkDeviceSize offset_limit = 0;
638 if (eInvalidMemoryOffset == aTestFlag) {
639 VkBuffer vulkanBuffer;
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600646 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600647
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
650 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600651 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
652 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600653 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600654 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600655 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600656 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 }
658 if (eOffsetAlignment < offset_limit) {
659 return true;
660 }
661 return false;
662 }
663
664 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
666 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (eBindNullBuffer == aTestFlag) {
668 VulkanMemory = 0;
669 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
670 } else {
671 VkBufferCreateInfo buffer_create_info = {};
672 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
673 buffer_create_info.size = 32;
674 buffer_create_info.usage = aBufferUsage;
675
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600676 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677
678 CreateCurrent = true;
679
680 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600681 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682
683 VkMemoryAllocateInfo memory_allocate_info = {};
684 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800685 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600686 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
687 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 if (!pass) {
689 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
690 return;
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600694 AllocateCurrent = true;
695 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600696 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
697 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 BoundCurrent = true;
699
700 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
701 }
702 }
703
704 ~VkBufferTest() {
705 if (CreateCurrent) {
706 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
707 }
708 if (AllocateCurrent) {
709 if (InvalidDeleteEn) {
710 union {
711 VkDeviceMemory device_memory;
712 unsigned long long index_access;
713 } bad_index;
714
715 bad_index.device_memory = VulkanMemory;
716 bad_index.index_access++;
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 }
720 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
721 }
722 }
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600725
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600727
728 void TestDoubleDestroy() {
729 // Destroy the buffer but leave the flag set, which will cause
730 // the buffer to be destroyed again in the destructor.
731 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
732 }
733
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700734 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600735 bool AllocateCurrent;
736 bool BoundCurrent;
737 bool CreateCurrent;
738 bool InvalidDeleteEn;
739
740 VkBuffer VulkanBuffer;
741 VkDevice VulkanDevice;
742 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600743};
744
745class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700746 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600747 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600748 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700749 : BoundCurrent(false),
750 AttributeCount(aAttributeCount),
751 BindingCount(aBindingCount),
752 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600753 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600754 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
755 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700756 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600757
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600758 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
759 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
762 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
763 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
764 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
765 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600766
767 unsigned i = 0;
768 do {
769 VertexInputAttributeDescription[i].binding = BindId;
770 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600771 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
772 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600773 i++;
774 } while (AttributeCount < i);
775
776 i = 0;
777 do {
778 VertexInputBindingDescription[i].binding = BindId;
779 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600780 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600781 i++;
782 } while (BindingCount < i);
783 }
784
785 ~VkVerticesObj() {
786 if (VertexInputAttributeDescription) {
787 delete[] VertexInputAttributeDescription;
788 }
789 if (VertexInputBindingDescription) {
790 delete[] VertexInputBindingDescription;
791 }
792 }
793
794 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
796 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600797 return true;
798 }
799
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600800 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600801 VkDeviceSize *offsetList;
802 unsigned offsetCount;
803
804 if (aOffsetCount) {
805 offsetList = aOffsetList;
806 offsetCount = aOffsetCount;
807 } else {
808 offsetList = new VkDeviceSize[1]();
809 offsetCount = 1;
810 }
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600813 BoundCurrent = true;
814
815 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600816 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600817 }
818 }
819
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700820 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600821 static uint32_t BindIdGenerator;
822
823 bool BoundCurrent;
824 unsigned AttributeCount;
825 unsigned BindingCount;
826 uint32_t BindId;
827
828 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
829 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
830 VkVertexInputBindingDescription *VertexInputBindingDescription;
831 VkConstantBufferObj VulkanMemoryBuffer;
832};
833
834uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500835// ********************************************************************************************************************
836// ********************************************************************************************************************
837// ********************************************************************************************************************
838// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700840 TEST_DESCRIPTION(
841 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
842 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600843
Tony Barbour1fa09702017-03-16 12:09:08 -0600844 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a pointer to a handle
848 // Expected to trigger an error with
849 // parameter_validation::validate_required_pointer
850 vkGetPhysicalDeviceFeatures(gpu(), NULL);
851 m_errorMonitor->VerifyFound();
852
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
854 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify NULL for pointer to array count
856 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600857 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600858 m_errorMonitor->VerifyFound();
859
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify 0 for a required array count
862 // Expected to trigger an error with parameter_validation::validate_array
863 VkViewport view_port = {};
864 m_commandBuffer->SetViewport(0, 0, &view_port);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify NULL for a required array
869 // Expected to trigger an error with parameter_validation::validate_array
870 m_commandBuffer->SetViewport(0, 1, NULL);
871 m_errorMonitor->VerifyFound();
872
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600874 // Specify VK_NULL_HANDLE for a required handle
875 // Expected to trigger an error with
876 // parameter_validation::validate_required_handle
877 vkUnmapMemory(device(), VK_NULL_HANDLE);
878 m_errorMonitor->VerifyFound();
879
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
881 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882 // Specify VK_NULL_HANDLE for a required handle array entry
883 // Expected to trigger an error with
884 // parameter_validation::validate_required_handle_array
885 VkFence fence = VK_NULL_HANDLE;
886 vkResetFences(device(), 1, &fence);
887 m_errorMonitor->VerifyFound();
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags parameter
899 // Expected to trigger an error with parameter_validation::validate_flags
900 m_commandBuffer->SetStencilReference(0, 0);
901 m_errorMonitor->VerifyFound();
902
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600904 // Specify 0 for a required VkFlags array entry
905 // Expected to trigger an error with
906 // parameter_validation::validate_flags_array
907 VkSemaphore semaphore = VK_NULL_HANDLE;
908 VkPipelineStageFlags stageFlags = 0;
909 VkSubmitInfo submitInfo = {};
910 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
911 submitInfo.waitSemaphoreCount = 1;
912 submitInfo.pWaitSemaphores = &semaphore;
913 submitInfo.pWaitDstStageMask = &stageFlags;
914 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
915 m_errorMonitor->VerifyFound();
916}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600917
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918TEST_F(VkLayerTest, ReservedParameter) {
919 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
920
Tony Barbour1fa09702017-03-16 12:09:08 -0600921 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600922
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600924 // Specify 0 for a reserved VkFlags parameter
925 // Expected to trigger an error with
926 // parameter_validation::validate_reserved_flags
927 VkEvent event_handle = VK_NULL_HANDLE;
928 VkEventCreateInfo event_info = {};
929 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
930 event_info.flags = 1;
931 vkCreateEvent(device(), &event_info, NULL, &event_handle);
932 m_errorMonitor->VerifyFound();
933}
934
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700936 TEST_DESCRIPTION(
937 "Specify an invalid VkStructureType for a Vulkan "
938 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939
Tony Barbour1fa09702017-03-16 12:09:08 -0600940 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600941
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943 // Zero struct memory, effectively setting sType to
944 // VK_STRUCTURE_TYPE_APPLICATION_INFO
945 // Expected to trigger an error with
946 // parameter_validation::validate_struct_type
947 VkMemoryAllocateInfo alloc_info = {};
948 VkDeviceMemory memory = VK_NULL_HANDLE;
949 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
950 m_errorMonitor->VerifyFound();
951
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600953 // Zero struct memory, effectively setting sType to
954 // VK_STRUCTURE_TYPE_APPLICATION_INFO
955 // Expected to trigger an error with
956 // parameter_validation::validate_struct_type_array
957 VkSubmitInfo submit_info = {};
958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
959 m_errorMonitor->VerifyFound();
960}
961
962TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600963 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600964
Tony Barbour1fa09702017-03-16 12:09:08 -0600965 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600966
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600968 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600969 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600970 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600971 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600972 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600973 // Zero-initialization will provide the correct sType
974 VkApplicationInfo app_info = {};
975 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
976 event_alloc_info.pNext = &app_info;
977 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
978 m_errorMonitor->VerifyFound();
979
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
981 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600982 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
983 // a function that has allowed pNext structure types and specify
984 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600985 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600987 VkMemoryAllocateInfo memory_alloc_info = {};
988 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
989 memory_alloc_info.pNext = &app_info;
990 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600991 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600992}
Dustin Graves5d33d532016-05-09 16:21:12 -0600993
994TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600995 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600996
Tony Barbour1fa09702017-03-16 12:09:08 -0600997 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1000 "does not fall within the begin..end "
1001 "range of the core VkFormat "
1002 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 // Specify an invalid VkFormat value
1004 // Expected to trigger an error with
1005 // parameter_validation::validate_ranged_enum
1006 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001007 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001008 m_errorMonitor->VerifyFound();
1009
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001011 // Specify an invalid VkFlags bitmask value
1012 // Expected to trigger an error with parameter_validation::validate_flags
1013 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001014 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1015 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001016 m_errorMonitor->VerifyFound();
1017
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001019 // Specify an invalid VkFlags array entry
1020 // Expected to trigger an error with
1021 // parameter_validation::validate_flags_array
1022 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001023 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001024 VkSubmitInfo submit_info = {};
1025 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1026 submit_info.waitSemaphoreCount = 1;
1027 submit_info.pWaitSemaphores = &semaphore;
1028 submit_info.pWaitDstStageMask = &stage_flags;
1029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1030 m_errorMonitor->VerifyFound();
1031
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001033 // Specify an invalid VkBool32 value
1034 // Expected to trigger a warning with
1035 // parameter_validation::validate_bool32
1036 VkSampler sampler = VK_NULL_HANDLE;
1037 VkSamplerCreateInfo sampler_info = {};
1038 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1039 sampler_info.pNext = NULL;
1040 sampler_info.magFilter = VK_FILTER_NEAREST;
1041 sampler_info.minFilter = VK_FILTER_NEAREST;
1042 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1043 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1044 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1045 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1046 sampler_info.mipLodBias = 1.0;
1047 sampler_info.maxAnisotropy = 1;
1048 sampler_info.compareEnable = VK_FALSE;
1049 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1050 sampler_info.minLod = 1.0;
1051 sampler_info.maxLod = 1.0;
1052 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1053 sampler_info.unnormalizedCoordinates = VK_FALSE;
1054 // Not VK_TRUE or VK_FALSE
1055 sampler_info.anisotropyEnable = 3;
1056 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1057 m_errorMonitor->VerifyFound();
1058}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001059
1060TEST_F(VkLayerTest, FailedReturnValue) {
1061 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1062
Tony Barbour1fa09702017-03-16 12:09:08 -06001063 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001064
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 // Find an unsupported image format
1066 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1067 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1068 VkFormat format = static_cast<VkFormat>(f);
1069 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001070 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001071 unsupported = format;
1072 break;
1073 }
1074 }
1075
1076 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1078 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001079 // Specify an unsupported VkFormat value to generate a
1080 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1081 // Expected to trigger a warning from
1082 // parameter_validation::validate_result
1083 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001084 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1085 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001086 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1087 m_errorMonitor->VerifyFound();
1088 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001089}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090
1091TEST_F(VkLayerTest, UpdateBufferAlignment) {
1092 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001093 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094
Tony Barbour1fa09702017-03-16 12:09:08 -06001095 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001096
1097 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1098 vk_testing::Buffer buffer;
1099 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1100
Tony Barbour552f6c02016-12-21 14:34:07 -07001101 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001102 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1105 m_errorMonitor->VerifyFound();
1106
1107 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using dataSize that is < 0
1113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001114 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001115 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1116 m_errorMonitor->VerifyFound();
1117
1118 // Introduce failure by using dataSize that is > 65536
1119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001120 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001121 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1122 m_errorMonitor->VerifyFound();
1123
Tony Barbour552f6c02016-12-21 14:34:07 -07001124 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001125}
1126
1127TEST_F(VkLayerTest, FillBufferAlignment) {
1128 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1129
Tony Barbour1fa09702017-03-16 12:09:08 -06001130 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001131
1132 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1133 vk_testing::Buffer buffer;
1134 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1135
Tony Barbour552f6c02016-12-21 14:34:07 -07001136 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001137
1138 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001140 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1141 m_errorMonitor->VerifyFound();
1142
1143 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001145 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1146 m_errorMonitor->VerifyFound();
1147
1148 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001150 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1151 m_errorMonitor->VerifyFound();
1152
Tony Barbour552f6c02016-12-21 14:34:07 -07001153 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001154}
Dustin Graves40f35822016-06-23 11:12:53 -06001155
Cortd889ff92016-07-27 09:51:27 -07001156TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1157 VkResult err;
1158
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001159 TEST_DESCRIPTION(
1160 "Attempt to use a non-solid polygon fill mode in a "
1161 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001162
Tony Barbour1fa09702017-03-16 12:09:08 -06001163 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1165
1166 std::vector<const char *> device_extension_names;
1167 auto features = m_device->phy().features();
1168 // Artificially disable support for non-solid fill modes
1169 features.fillModeNonSolid = false;
1170 // The sacrificial device object
1171 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1172
1173 VkRenderpassObj render_pass(&test_device);
1174
1175 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1176 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1177 pipeline_layout_ci.setLayoutCount = 0;
1178 pipeline_layout_ci.pSetLayouts = NULL;
1179
1180 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001181 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001182 ASSERT_VK_SUCCESS(err);
1183
1184 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1185 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1186 rs_ci.pNext = nullptr;
1187 rs_ci.lineWidth = 1.0f;
1188 rs_ci.rasterizerDiscardEnable = true;
1189
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001190 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1191 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001192
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001193 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1195 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001196 {
1197 VkPipelineObj pipe(&test_device);
1198 pipe.AddShader(&vs);
1199 pipe.AddShader(&fs);
1200 pipe.AddColorAttachment();
1201 // Introduce failure by setting unsupported polygon mode
1202 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1203 pipe.SetRasterization(&rs_ci);
1204 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1205 }
1206 m_errorMonitor->VerifyFound();
1207
1208 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1210 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001211 {
1212 VkPipelineObj pipe(&test_device);
1213 pipe.AddShader(&vs);
1214 pipe.AddShader(&fs);
1215 pipe.AddColorAttachment();
1216 // Introduce failure by setting unsupported polygon mode
1217 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1218 pipe.SetRasterization(&rs_ci);
1219 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1220 }
1221 m_errorMonitor->VerifyFound();
1222
Cortd889ff92016-07-27 09:51:27 -07001223 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1224}
1225
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001226#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001227TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001228{
1229 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001230 VkFenceCreateInfo fenceInfo = {};
1231 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1232 fenceInfo.pNext = NULL;
1233 fenceInfo.flags = 0;
1234
Mike Weiblencce7ec72016-10-17 19:33:05 -06001235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001236
Tony Barbour1fa09702017-03-16 12:09:08 -06001237 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001238
1239 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1240 vk_testing::Buffer buffer;
1241 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001242
Tony Barbourfe3351b2015-07-28 10:17:20 -06001243 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001244 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001245 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001246
1247 testFence.init(*m_device, fenceInfo);
1248
1249 // Bypass framework since it does the waits automatically
1250 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001251 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001252 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1253 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001254 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001255 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001256 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001257 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001258 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001259 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001260 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001261
1262 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001263 ASSERT_VK_SUCCESS( err );
1264
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001265 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001266 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001267
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001268 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001269}
1270
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001271TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001272{
1273 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001274 VkFenceCreateInfo fenceInfo = {};
1275 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1276 fenceInfo.pNext = NULL;
1277 fenceInfo.flags = 0;
1278
Mike Weiblencce7ec72016-10-17 19:33:05 -06001279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001280
Tony Barbour1fa09702017-03-16 12:09:08 -06001281 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001282 ASSERT_NO_FATAL_FAILURE(InitViewport());
1283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1284
Tony Barbourfe3351b2015-07-28 10:17:20 -06001285 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001286 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001287 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001288
1289 testFence.init(*m_device, fenceInfo);
1290
1291 // Bypass framework since it does the waits automatically
1292 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001293 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001294 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1295 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001296 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001297 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001298 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001299 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001300 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001301 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001302 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001303
1304 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001305 ASSERT_VK_SUCCESS( err );
1306
Jon Ashburnf19916e2016-01-11 13:12:43 -07001307 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001308 VkCommandBufferBeginInfo info = {};
1309 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1310 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001311 info.renderPass = VK_NULL_HANDLE;
1312 info.subpass = 0;
1313 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001314 info.occlusionQueryEnable = VK_FALSE;
1315 info.queryFlags = 0;
1316 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001317
1318 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001319 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001320
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001321 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001322}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001323#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001324
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001325TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1326 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1327
Tony Barbour1fa09702017-03-16 12:09:08 -06001328 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001329
1330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1331 VkBuffer buffer;
1332 VkBufferCreateInfo buf_info = {};
1333 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1334 buf_info.pNext = NULL;
1335 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1336 buf_info.size = 2048;
1337 buf_info.queueFamilyIndexCount = 0;
1338 buf_info.pQueueFamilyIndices = NULL;
1339 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1340 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1341 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1342 m_errorMonitor->VerifyFound();
1343
1344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1345 VkImage image;
1346 VkImageCreateInfo image_create_info = {};
1347 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1348 image_create_info.pNext = NULL;
1349 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1350 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1351 image_create_info.extent.width = 512;
1352 image_create_info.extent.height = 64;
1353 image_create_info.extent.depth = 1;
1354 image_create_info.mipLevels = 1;
1355 image_create_info.arrayLayers = 1;
1356 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1357 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1358 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1359 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1360 image_create_info.queueFamilyIndexCount = 0;
1361 image_create_info.pQueueFamilyIndices = NULL;
1362 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1363 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1364 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1365 m_errorMonitor->VerifyFound();
1366}
1367
Dave Houlton829c0d82017-01-24 15:09:17 -07001368TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1369 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1370
1371 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001372 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001373 ASSERT_NO_FATAL_FAILURE(
1374 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001375 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001376
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001377 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001378 device_features.sparseResidencyImage2D = VK_FALSE;
1379 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001380 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001381
1382 VkImage image = VK_NULL_HANDLE;
1383 VkResult result = VK_RESULT_MAX_ENUM;
1384 VkImageCreateInfo image_create_info = {};
1385 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1386 image_create_info.pNext = NULL;
1387 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1388 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1389 image_create_info.extent.width = 512;
1390 image_create_info.extent.height = 1;
1391 image_create_info.extent.depth = 1;
1392 image_create_info.mipLevels = 1;
1393 image_create_info.arrayLayers = 1;
1394 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1395 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1396 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1397 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1398 image_create_info.queueFamilyIndexCount = 0;
1399 image_create_info.pQueueFamilyIndices = NULL;
1400 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1401 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1402
1403 // 1D image w/ sparse residency is an error
1404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1405 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1406 m_errorMonitor->VerifyFound();
1407 if (VK_SUCCESS == result) {
1408 vkDestroyImage(m_device->device(), image, NULL);
1409 image = VK_NULL_HANDLE;
1410 }
1411
1412 // 2D image w/ sparse residency when feature isn't available
1413 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1414 image_create_info.extent.height = 64;
1415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1416 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1417 m_errorMonitor->VerifyFound();
1418 if (VK_SUCCESS == result) {
1419 vkDestroyImage(m_device->device(), image, NULL);
1420 image = VK_NULL_HANDLE;
1421 }
1422
1423 // 3D image w/ sparse residency when feature isn't available
1424 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1425 image_create_info.extent.depth = 8;
1426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1427 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1428 m_errorMonitor->VerifyFound();
1429 if (VK_SUCCESS == result) {
1430 vkDestroyImage(m_device->device(), image, NULL);
1431 image = VK_NULL_HANDLE;
1432 }
1433}
1434
1435TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1436 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1437
1438 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001439 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001440 ASSERT_NO_FATAL_FAILURE(
1441 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001442 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001443
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001444 // These tests require that the device support sparse residency for 2D images
1445 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1446 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001447 return;
1448 }
1449
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001450 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001451 device_features.sparseResidency2Samples = VK_FALSE;
1452 device_features.sparseResidency4Samples = VK_FALSE;
1453 device_features.sparseResidency8Samples = VK_FALSE;
1454 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001455 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001456
1457 VkImage image = VK_NULL_HANDLE;
1458 VkResult result = VK_RESULT_MAX_ENUM;
1459 VkImageCreateInfo image_create_info = {};
1460 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1461 image_create_info.pNext = NULL;
1462 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1463 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1464 image_create_info.extent.width = 64;
1465 image_create_info.extent.height = 64;
1466 image_create_info.extent.depth = 1;
1467 image_create_info.mipLevels = 1;
1468 image_create_info.arrayLayers = 1;
1469 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1470 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1471 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1472 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1473 image_create_info.queueFamilyIndexCount = 0;
1474 image_create_info.pQueueFamilyIndices = NULL;
1475 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1476 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1477
1478 // 2D image w/ sparse residency and linear tiling is an error
1479 m_errorMonitor->SetDesiredFailureMsg(
1480 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1481 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1482 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1483 m_errorMonitor->VerifyFound();
1484 if (VK_SUCCESS == result) {
1485 vkDestroyImage(m_device->device(), image, NULL);
1486 image = VK_NULL_HANDLE;
1487 }
1488 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1489
1490 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1491 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1493 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1494 m_errorMonitor->VerifyFound();
1495 if (VK_SUCCESS == result) {
1496 vkDestroyImage(m_device->device(), image, NULL);
1497 image = VK_NULL_HANDLE;
1498 }
1499
1500 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1502 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1503 m_errorMonitor->VerifyFound();
1504 if (VK_SUCCESS == result) {
1505 vkDestroyImage(m_device->device(), image, NULL);
1506 image = VK_NULL_HANDLE;
1507 }
1508
1509 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1511 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1512 m_errorMonitor->VerifyFound();
1513 if (VK_SUCCESS == result) {
1514 vkDestroyImage(m_device->device(), image, NULL);
1515 image = VK_NULL_HANDLE;
1516 }
1517
1518 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1520 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1521 m_errorMonitor->VerifyFound();
1522 if (VK_SUCCESS == result) {
1523 vkDestroyImage(m_device->device(), image, NULL);
1524 image = VK_NULL_HANDLE;
1525 }
1526}
1527
Tobin Ehlisf11be982016-05-11 13:52:53 -06001528TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001529 TEST_DESCRIPTION(
1530 "Create a buffer and image, allocate memory, and bind the "
1531 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001532 VkResult err;
1533 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001534 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001535
Tobin Ehlis077ded32016-05-12 17:39:13 -06001536 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001537 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001538 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001539 VkDeviceMemory mem; // buffer will be bound first
1540 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001541 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001542 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001543
1544 VkBufferCreateInfo buf_info = {};
1545 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1546 buf_info.pNext = NULL;
1547 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1548 buf_info.size = 256;
1549 buf_info.queueFamilyIndexCount = 0;
1550 buf_info.pQueueFamilyIndices = NULL;
1551 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1552 buf_info.flags = 0;
1553 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1554 ASSERT_VK_SUCCESS(err);
1555
Tobin Ehlis077ded32016-05-12 17:39:13 -06001556 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001557
1558 VkImageCreateInfo image_create_info = {};
1559 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1560 image_create_info.pNext = NULL;
1561 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1562 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1563 image_create_info.extent.width = 64;
1564 image_create_info.extent.height = 64;
1565 image_create_info.extent.depth = 1;
1566 image_create_info.mipLevels = 1;
1567 image_create_info.arrayLayers = 1;
1568 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001569 // Image tiling must be optimal to trigger error when aliasing linear buffer
1570 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001571 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1572 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1573 image_create_info.queueFamilyIndexCount = 0;
1574 image_create_info.pQueueFamilyIndices = NULL;
1575 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1576 image_create_info.flags = 0;
1577
Tobin Ehlisf11be982016-05-11 13:52:53 -06001578 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1579 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001580 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1581 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001582
Tobin Ehlis077ded32016-05-12 17:39:13 -06001583 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1584
1585 VkMemoryAllocateInfo alloc_info = {};
1586 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1587 alloc_info.pNext = NULL;
1588 alloc_info.memoryTypeIndex = 0;
1589 // Ensure memory is big enough for both bindings
1590 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001591 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1592 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001593 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001596 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001597 return;
1598 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001599 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1600 ASSERT_VK_SUCCESS(err);
1601 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1602 ASSERT_VK_SUCCESS(err);
1603
Rene Lindsayd14f5572016-12-16 14:57:18 -07001604 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1605
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001607 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001608 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1609 m_errorMonitor->VerifyFound();
1610
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001611 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001612 // aliasing buffer2
1613 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1614 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001615 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1616 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001617 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001618 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001620 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001621 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001622 m_errorMonitor->VerifyFound();
1623
1624 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001625 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001626 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001627 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001628 vkFreeMemory(m_device->device(), mem, NULL);
1629 vkFreeMemory(m_device->device(), mem_img, NULL);
1630}
1631
Tobin Ehlis35372522016-05-12 08:32:31 -06001632TEST_F(VkLayerTest, InvalidMemoryMapping) {
1633 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1634 VkResult err;
1635 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001636 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001637
1638 VkBuffer buffer;
1639 VkDeviceMemory mem;
1640 VkMemoryRequirements mem_reqs;
1641
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001642 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1643
Tobin Ehlis35372522016-05-12 08:32:31 -06001644 VkBufferCreateInfo buf_info = {};
1645 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1646 buf_info.pNext = NULL;
1647 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1648 buf_info.size = 256;
1649 buf_info.queueFamilyIndexCount = 0;
1650 buf_info.pQueueFamilyIndices = NULL;
1651 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1652 buf_info.flags = 0;
1653 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1654 ASSERT_VK_SUCCESS(err);
1655
1656 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1657 VkMemoryAllocateInfo alloc_info = {};
1658 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1659 alloc_info.pNext = NULL;
1660 alloc_info.memoryTypeIndex = 0;
1661
1662 // Ensure memory is big enough for both bindings
1663 static const VkDeviceSize allocation_size = 0x10000;
1664 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001665 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001666 if (!pass) {
1667 vkDestroyBuffer(m_device->device(), buffer, NULL);
1668 return;
1669 }
1670 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1671 ASSERT_VK_SUCCESS(err);
1672
1673 uint8_t *pData;
1674 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001676 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1677 m_errorMonitor->VerifyFound();
1678 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001679 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001680 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1682 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1683 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001684 m_errorMonitor->VerifyFound();
1685
1686 // Unmap the memory to avoid re-map error
1687 vkUnmapMemory(m_device->device(), mem);
1688 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1690 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1691 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001692 m_errorMonitor->VerifyFound();
1693 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1695 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001696 m_errorMonitor->VerifyFound();
1697 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001699 vkUnmapMemory(m_device->device(), mem);
1700 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001701
Tobin Ehlis35372522016-05-12 08:32:31 -06001702 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001703 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001704 ASSERT_VK_SUCCESS(err);
1705 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001706 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001707 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001708 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001710 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1711 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001712
Tobin Ehlis35372522016-05-12 08:32:31 -06001713 // Now flush range that oversteps mapped range
1714 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001715 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001716 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001717 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001718 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1720 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1721 m_errorMonitor->VerifyFound();
1722
1723 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1724 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001725 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001726 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001727 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001728 mmr.size = VK_WHOLE_SIZE;
1729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001730 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1731 m_errorMonitor->VerifyFound();
1732
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001733#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001734 // Some platforms have an atomsize of 1 which makes the test meaningless
1735 if (atom_size > 3) {
1736 // Now with an offset NOT a multiple of the device limit
1737 vkUnmapMemory(m_device->device(), mem);
1738 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1739 ASSERT_VK_SUCCESS(err);
1740 mmr.offset = 3; // Not a multiple of atom_size
1741 mmr.size = VK_WHOLE_SIZE;
1742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1743 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1744 m_errorMonitor->VerifyFound();
1745
1746 // Now with a size NOT a multiple of the device limit
1747 vkUnmapMemory(m_device->device(), mem);
1748 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1749 ASSERT_VK_SUCCESS(err);
1750 mmr.offset = atom_size;
1751 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1753 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1754 m_errorMonitor->VerifyFound();
1755 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001756#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001757 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1758 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001759 if (!pass) {
1760 vkFreeMemory(m_device->device(), mem, NULL);
1761 vkDestroyBuffer(m_device->device(), buffer, NULL);
1762 return;
1763 }
1764 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1765 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1766
1767 vkDestroyBuffer(m_device->device(), buffer, NULL);
1768 vkFreeMemory(m_device->device(), mem, NULL);
1769}
1770
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001771#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001772TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1773 VkResult err;
1774 bool pass;
1775
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001776 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1777 // following declaration (which is temporarily being moved below):
1778 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001779 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001780 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001781 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001782 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001783 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001784 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001785
Tony Barbour1fa09702017-03-16 12:09:08 -06001786 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001787
Ian Elliott3f06ce52016-04-29 14:46:21 -06001788#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1789#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1790 // Use the functions from the VK_KHR_android_surface extension without
1791 // enabling that extension:
1792
1793 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001794 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1796 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001797 pass = (err != VK_SUCCESS);
1798 ASSERT_TRUE(pass);
1799 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001800#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001801
Ian Elliott3f06ce52016-04-29 14:46:21 -06001802#if defined(VK_USE_PLATFORM_MIR_KHR)
1803 // Use the functions from the VK_KHR_mir_surface extension without enabling
1804 // that extension:
1805
1806 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001807 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001809 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1810 pass = (err != VK_SUCCESS);
1811 ASSERT_TRUE(pass);
1812 m_errorMonitor->VerifyFound();
1813
1814 // Tell whether an mir_connection supports presentation:
1815 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1817 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001819#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001820
Ian Elliott3f06ce52016-04-29 14:46:21 -06001821#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1822 // Use the functions from the VK_KHR_wayland_surface extension without
1823 // enabling that extension:
1824
1825 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001826 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1828 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001829 pass = (err != VK_SUCCESS);
1830 ASSERT_TRUE(pass);
1831 m_errorMonitor->VerifyFound();
1832
1833 // Tell whether an wayland_display supports presentation:
1834 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1836 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001837 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001838#endif // VK_USE_PLATFORM_WAYLAND_KHR
1839#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001840
Ian Elliott3f06ce52016-04-29 14:46:21 -06001841#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001842 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1843 // TO NON-LINUX PLATFORMS:
1844 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001845 // Use the functions from the VK_KHR_win32_surface extension without
1846 // enabling that extension:
1847
1848 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001849 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1851 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001852 pass = (err != VK_SUCCESS);
1853 ASSERT_TRUE(pass);
1854 m_errorMonitor->VerifyFound();
1855
1856 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001858 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001859 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001860// Set this (for now, until all platforms are supported and tested):
1861#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001862#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001863#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001864 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1865 // TO NON-LINUX PLATFORMS:
1866 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001867#endif
1868#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001869 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1870 // that extension:
1871
1872 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001873 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001875 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1876 pass = (err != VK_SUCCESS);
1877 ASSERT_TRUE(pass);
1878 m_errorMonitor->VerifyFound();
1879
1880 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001881 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001882 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1884 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001886// Set this (for now, until all platforms are supported and tested):
1887#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001888#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001889
Ian Elliott12630812016-04-29 14:35:43 -06001890#if defined(VK_USE_PLATFORM_XLIB_KHR)
1891 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1892 // that extension:
1893
1894 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001895 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001897 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1898 pass = (err != VK_SUCCESS);
1899 ASSERT_TRUE(pass);
1900 m_errorMonitor->VerifyFound();
1901
1902 // Tell whether an Xlib VisualID supports presentation:
1903 Display *dpy = NULL;
1904 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001906 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1907 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001908// Set this (for now, until all platforms are supported and tested):
1909#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001910#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001911
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001912// Use the functions from the VK_KHR_surface extension without enabling
1913// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001914
Ian Elliott489eec02016-05-05 14:12:44 -06001915#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001916 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001918 vkDestroySurfaceKHR(instance(), surface, NULL);
1919 m_errorMonitor->VerifyFound();
1920
1921 // Check if surface supports presentation:
1922 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001924 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1925 pass = (err != VK_SUCCESS);
1926 ASSERT_TRUE(pass);
1927 m_errorMonitor->VerifyFound();
1928
1929 // Check surface capabilities:
1930 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1932 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001933 pass = (err != VK_SUCCESS);
1934 ASSERT_TRUE(pass);
1935 m_errorMonitor->VerifyFound();
1936
1937 // Check surface formats:
1938 uint32_t format_count = 0;
1939 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1941 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001942 pass = (err != VK_SUCCESS);
1943 ASSERT_TRUE(pass);
1944 m_errorMonitor->VerifyFound();
1945
1946 // Check surface present modes:
1947 uint32_t present_mode_count = 0;
1948 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1950 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001951 pass = (err != VK_SUCCESS);
1952 ASSERT_TRUE(pass);
1953 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001954#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001955
Ian Elliott1c32c772016-04-28 14:47:13 -06001956 // Use the functions from the VK_KHR_swapchain extension without enabling
1957 // that extension:
1958
1959 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001961 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1962 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001963 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001964 pass = (err != VK_SUCCESS);
1965 ASSERT_TRUE(pass);
1966 m_errorMonitor->VerifyFound();
1967
1968 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1970 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001971 pass = (err != VK_SUCCESS);
1972 ASSERT_TRUE(pass);
1973 m_errorMonitor->VerifyFound();
1974
Chris Forbeseb7d5502016-09-13 18:19:21 +12001975 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1976 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1977 VkFence fence;
1978 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1979
Ian Elliott1c32c772016-04-28 14:47:13 -06001980 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001982 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001983 pass = (err != VK_SUCCESS);
1984 ASSERT_TRUE(pass);
1985 m_errorMonitor->VerifyFound();
1986
Chris Forbeseb7d5502016-09-13 18:19:21 +12001987 vkDestroyFence(m_device->device(), fence, nullptr);
1988
Ian Elliott1c32c772016-04-28 14:47:13 -06001989 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001990 //
1991 // NOTE: Currently can't test this because a real swapchain is needed (as
1992 // opposed to the fake one we created) in order for the layer to lookup the
1993 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001994
1995 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001997 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1998 m_errorMonitor->VerifyFound();
1999}
Chris Forbes09368e42016-10-13 11:59:22 +13002000#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06002001
Karl Schultz6addd812016-02-02 17:17:23 -07002002TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2003 VkResult err;
2004 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002005
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2007 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002008
Tony Barbour1fa09702017-03-16 12:09:08 -06002009 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002010
2011 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002012 VkImage image;
2013 VkDeviceMemory mem;
2014 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002015
Karl Schultz6addd812016-02-02 17:17:23 -07002016 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2017 const int32_t tex_width = 32;
2018 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002019
Tony Barboureb254902015-07-15 12:50:33 -06002020 VkImageCreateInfo image_create_info = {};
2021 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002022 image_create_info.pNext = NULL;
2023 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2024 image_create_info.format = tex_format;
2025 image_create_info.extent.width = tex_width;
2026 image_create_info.extent.height = tex_height;
2027 image_create_info.extent.depth = 1;
2028 image_create_info.mipLevels = 1;
2029 image_create_info.arrayLayers = 1;
2030 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2031 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2032 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2033 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002034 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002035
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002036 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002037 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002038 mem_alloc.pNext = NULL;
2039 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040
Chia-I Wuf7458c52015-10-26 21:10:41 +08002041 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002042 ASSERT_VK_SUCCESS(err);
2043
Karl Schultz6addd812016-02-02 17:17:23 -07002044 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002045
Mark Lobodzinski23065352015-05-29 09:32:35 -05002046 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002047
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002048 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002049 if (!pass) { // If we can't find any unmappable memory this test doesn't
2050 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002051 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002052 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002053 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002054
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002055 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002056 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002057 ASSERT_VK_SUCCESS(err);
2058
2059 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002060 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002061 ASSERT_VK_SUCCESS(err);
2062
2063 // Map memory as if to initialize the image
2064 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002065 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002066
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002067 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002068
Chia-I Wuf7458c52015-10-26 21:10:41 +08002069 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002070 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002071}
2072
Karl Schultz6addd812016-02-02 17:17:23 -07002073TEST_F(VkLayerTest, RebindMemory) {
2074 VkResult err;
2075 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002078
Tony Barbour1fa09702017-03-16 12:09:08 -06002079 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002080
2081 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002082 VkImage image;
2083 VkDeviceMemory mem1;
2084 VkDeviceMemory mem2;
2085 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002086
Karl Schultz6addd812016-02-02 17:17:23 -07002087 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2088 const int32_t tex_width = 32;
2089 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002090
Tony Barboureb254902015-07-15 12:50:33 -06002091 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002092 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2093 image_create_info.pNext = NULL;
2094 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2095 image_create_info.format = tex_format;
2096 image_create_info.extent.width = tex_width;
2097 image_create_info.extent.height = tex_height;
2098 image_create_info.extent.depth = 1;
2099 image_create_info.mipLevels = 1;
2100 image_create_info.arrayLayers = 1;
2101 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2102 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2103 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2104 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002105
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002106 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002107 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2108 mem_alloc.pNext = NULL;
2109 mem_alloc.allocationSize = 0;
2110 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 // Introduce failure, do NOT set memProps to
2113 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002114 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002115 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002116 ASSERT_VK_SUCCESS(err);
2117
Karl Schultz6addd812016-02-02 17:17:23 -07002118 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002119
2120 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002121 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002122 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002123
2124 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002125 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002126 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002127 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002128 ASSERT_VK_SUCCESS(err);
2129
2130 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002131 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002132 ASSERT_VK_SUCCESS(err);
2133
Karl Schultz6addd812016-02-02 17:17:23 -07002134 // Introduce validation failure, try to bind a different memory object to
2135 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002136 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002137
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002138 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002139
Chia-I Wuf7458c52015-10-26 21:10:41 +08002140 vkDestroyImage(m_device->device(), image, NULL);
2141 vkFreeMemory(m_device->device(), mem1, NULL);
2142 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002143}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002144
Karl Schultz6addd812016-02-02 17:17:23 -07002145TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002146 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002147
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2149 "submitted in SIGNALED state. Fences "
2150 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002151
2152 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002153 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2154 fenceInfo.pNext = NULL;
2155 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002156
Tony Barbour1fa09702017-03-16 12:09:08 -06002157 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002158 ASSERT_NO_FATAL_FAILURE(InitViewport());
2159 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2160
Tony Barbour552f6c02016-12-21 14:34:07 -07002161 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002163 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002164
2165 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002166
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002167 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002168 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2169 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002170 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002171 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002172 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002173 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002174 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002175 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002176 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002177
2178 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002179 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002180
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002181 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002182}
Chris Forbes4e44c912016-06-16 10:20:00 +12002183
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002184TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002185 TEST_DESCRIPTION(
2186 "Specify wrong usage for image then create conflicting view of image "
2187 "Initialize buffer with wrong usage then perform copy expecting errors "
2188 "from both the image and the buffer (2 calls)");
Mark Lobodzinski33826372017-04-13 11:10:11 -06002189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for Image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002190
Tony Barbour1fa09702017-03-16 12:09:08 -06002191 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002192 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002193 if (!format) {
2194 printf(" No Depth + Stencil format found. Skipped.\n");
2195 return;
2196 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002197
Tony Barbourf92621a2016-05-02 14:28:12 -06002198 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002199 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002200 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002201 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002202
Tony Barbourf92621a2016-05-02 14:28:12 -06002203 VkImageView dsv;
2204 VkImageViewCreateInfo dsvci = {};
2205 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2206 dsvci.image = image.handle();
2207 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002208 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002209 dsvci.subresourceRange.layerCount = 1;
2210 dsvci.subresourceRange.baseMipLevel = 0;
2211 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002212 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002213
Tony Barbourf92621a2016-05-02 14:28:12 -06002214 // Create a view with depth / stencil aspect for image with different usage
2215 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002216
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002217 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002218
2219 // Initialize buffer with TRANSFER_DST usage
2220 vk_testing::Buffer buffer;
2221 VkMemoryPropertyFlags reqs = 0;
2222 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2223 VkBufferImageCopy region = {};
2224 region.bufferRowLength = 128;
2225 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002226 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002227 region.imageSubresource.layerCount = 1;
2228 region.imageExtent.height = 16;
2229 region.imageExtent.width = 16;
2230 region.imageExtent.depth = 1;
2231
Mark Lobodzinski80871462017-02-16 10:37:27 -07002232 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002233 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002234
Chris Forbesda581202016-10-06 18:25:26 +13002235 // two separate errors from this call:
Mark Lobodzinski33826372017-04-13 11:10:11 -06002236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Chris Forbesda581202016-10-06 18:25:26 +13002238
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002239 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2240 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002241 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002242}
Tony Barbour75d79f02016-08-30 09:39:07 -06002243
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002244TEST_F(VkLayerTest, LeakAnObject) {
2245 VkResult err;
2246
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002247 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002248
2249 // Note that we have to create a new device since destroying the
2250 // framework's device causes Teardown() to fail and just calling Teardown
2251 // will destroy the errorMonitor.
2252
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002254
Tony Barbour1fa09702017-03-16 12:09:08 -06002255 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002256
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002257 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002258 std::vector<VkDeviceQueueCreateInfo> queue_info;
2259 queue_info.reserve(queue_props.size());
2260 std::vector<std::vector<float>> queue_priorities;
2261 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2262 VkDeviceQueueCreateInfo qi = {};
2263 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2264 qi.pNext = NULL;
2265 qi.queueFamilyIndex = i;
2266 qi.queueCount = queue_props[i].queueCount;
2267 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2268 qi.pQueuePriorities = queue_priorities[i].data();
2269 queue_info.push_back(qi);
2270 }
2271
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002272 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002273
2274 // The sacrificial device object
2275 VkDevice testDevice;
2276 VkDeviceCreateInfo device_create_info = {};
2277 auto features = m_device->phy().features();
2278 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2279 device_create_info.pNext = NULL;
2280 device_create_info.queueCreateInfoCount = queue_info.size();
2281 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002282 device_create_info.enabledLayerCount = 0;
2283 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002284 device_create_info.pEnabledFeatures = &features;
2285 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2286 ASSERT_VK_SUCCESS(err);
2287
2288 VkFence fence;
2289 VkFenceCreateInfo fence_create_info = {};
2290 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2291 fence_create_info.pNext = NULL;
2292 fence_create_info.flags = 0;
2293 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2294 ASSERT_VK_SUCCESS(err);
2295
2296 // Induce failure by not calling vkDestroyFence
2297 vkDestroyDevice(testDevice, NULL);
2298 m_errorMonitor->VerifyFound();
2299}
2300
2301TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002302 TEST_DESCRIPTION(
2303 "Allocate command buffers from one command pool and "
2304 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307
Tony Barbour1fa09702017-03-16 12:09:08 -06002308 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002309 VkCommandPool command_pool_one;
2310 VkCommandPool command_pool_two;
2311
2312 VkCommandPoolCreateInfo pool_create_info{};
2313 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2314 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2315 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2316
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002317 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002318
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002319 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002320
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002321 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002323 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002325 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002326 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002327 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002328
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002329 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002330
2331 m_errorMonitor->VerifyFound();
2332
2333 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2334 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2335}
2336
2337TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2338 VkResult err;
2339
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002340 TEST_DESCRIPTION(
2341 "Allocate descriptor sets from one DS pool and "
2342 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002343
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002345
Tony Barbour1fa09702017-03-16 12:09:08 -06002346 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2348
2349 VkDescriptorPoolSize ds_type_count = {};
2350 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2351 ds_type_count.descriptorCount = 1;
2352
2353 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2354 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2355 ds_pool_ci.pNext = NULL;
2356 ds_pool_ci.flags = 0;
2357 ds_pool_ci.maxSets = 1;
2358 ds_pool_ci.poolSizeCount = 1;
2359 ds_pool_ci.pPoolSizes = &ds_type_count;
2360
2361 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002363 ASSERT_VK_SUCCESS(err);
2364
2365 // Create a second descriptor pool
2366 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002367 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002368 ASSERT_VK_SUCCESS(err);
2369
2370 VkDescriptorSetLayoutBinding dsl_binding = {};
2371 dsl_binding.binding = 0;
2372 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2373 dsl_binding.descriptorCount = 1;
2374 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2375 dsl_binding.pImmutableSamplers = NULL;
2376
2377 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2378 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2379 ds_layout_ci.pNext = NULL;
2380 ds_layout_ci.bindingCount = 1;
2381 ds_layout_ci.pBindings = &dsl_binding;
2382
2383 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002384 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002385 ASSERT_VK_SUCCESS(err);
2386
2387 VkDescriptorSet descriptorSet;
2388 VkDescriptorSetAllocateInfo alloc_info = {};
2389 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2390 alloc_info.descriptorSetCount = 1;
2391 alloc_info.descriptorPool = ds_pool_one;
2392 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002393 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002394 ASSERT_VK_SUCCESS(err);
2395
2396 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2397
2398 m_errorMonitor->VerifyFound();
2399
2400 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2401 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2402 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2403}
2404
2405TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002407
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002408 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002409
Tony Barbour1fa09702017-03-16 12:09:08 -06002410 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002411
2412 // Pass bogus handle into GetImageMemoryRequirements
2413 VkMemoryRequirements mem_reqs;
2414 uint64_t fakeImageHandle = 0xCADECADE;
2415 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2416
2417 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2418
2419 m_errorMonitor->VerifyFound();
2420}
2421
Mike Schuchardt17838902017-02-21 09:48:06 -07002422TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2423 TEST_DESCRIPTION(
2424 "Try to destroy a render pass object using a device other than the one it was created on. "
2425 "This should generate a distinct error from the invalid handle error.");
2426 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002427 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2429
2430 // Create second device
2431 float priorities[] = {1.0f};
2432 VkDeviceQueueCreateInfo queue_info{};
2433 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2434 queue_info.pNext = NULL;
2435 queue_info.flags = 0;
2436 queue_info.queueFamilyIndex = 0;
2437 queue_info.queueCount = 1;
2438 queue_info.pQueuePriorities = &priorities[0];
2439
2440 VkDeviceCreateInfo device_create_info = {};
2441 auto features = m_device->phy().features();
2442 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2443 device_create_info.pNext = NULL;
2444 device_create_info.queueCreateInfoCount = 1;
2445 device_create_info.pQueueCreateInfos = &queue_info;
2446 device_create_info.enabledLayerCount = 0;
2447 device_create_info.ppEnabledLayerNames = NULL;
2448 device_create_info.pEnabledFeatures = &features;
2449
2450 VkDevice second_device;
2451 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2452
2453 // Try to destroy the renderpass from the first device using the second device
2454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2455 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2456 m_errorMonitor->VerifyFound();
2457
2458 vkDestroyDevice(second_device, NULL);
2459}
2460
Karl Schultz6addd812016-02-02 17:17:23 -07002461TEST_F(VkLayerTest, PipelineNotBound) {
2462 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002464 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002465
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002467
Tony Barbour1fa09702017-03-16 12:09:08 -06002468 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002470
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002471 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002472 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2473 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002474
2475 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002476 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2477 ds_pool_ci.pNext = NULL;
2478 ds_pool_ci.maxSets = 1;
2479 ds_pool_ci.poolSizeCount = 1;
2480 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002481
2482 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002483 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002484 ASSERT_VK_SUCCESS(err);
2485
2486 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002487 dsl_binding.binding = 0;
2488 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2489 dsl_binding.descriptorCount = 1;
2490 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2491 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
2493 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002494 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2495 ds_layout_ci.pNext = NULL;
2496 ds_layout_ci.bindingCount = 1;
2497 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002498
2499 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002500 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002501 ASSERT_VK_SUCCESS(err);
2502
2503 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002504 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002505 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002506 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002507 alloc_info.descriptorPool = ds_pool;
2508 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002509 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002510 ASSERT_VK_SUCCESS(err);
2511
2512 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002513 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2514 pipeline_layout_ci.pNext = NULL;
2515 pipeline_layout_ci.setLayoutCount = 1;
2516 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002517
2518 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002519 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002520 ASSERT_VK_SUCCESS(err);
2521
Mark Youngad779052016-01-06 14:26:04 -07002522 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002523
Tony Barbour552f6c02016-12-21 14:34:07 -07002524 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002525 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002526
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002527 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002528
Chia-I Wuf7458c52015-10-26 21:10:41 +08002529 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2531 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002532}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002533
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002534TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2535 VkResult err;
2536
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002537 TEST_DESCRIPTION(
2538 "Test validation check for an invalid memory type index "
2539 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002540
Tony Barbour1fa09702017-03-16 12:09:08 -06002541 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002542
2543 // Create an image, allocate memory, set a bad typeIndex and then try to
2544 // bind it
2545 VkImage image;
2546 VkDeviceMemory mem;
2547 VkMemoryRequirements mem_reqs;
2548 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2549 const int32_t tex_width = 32;
2550 const int32_t tex_height = 32;
2551
2552 VkImageCreateInfo image_create_info = {};
2553 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2554 image_create_info.pNext = NULL;
2555 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2556 image_create_info.format = tex_format;
2557 image_create_info.extent.width = tex_width;
2558 image_create_info.extent.height = tex_height;
2559 image_create_info.extent.depth = 1;
2560 image_create_info.mipLevels = 1;
2561 image_create_info.arrayLayers = 1;
2562 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2563 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2564 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2565 image_create_info.flags = 0;
2566
2567 VkMemoryAllocateInfo mem_alloc = {};
2568 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2569 mem_alloc.pNext = NULL;
2570 mem_alloc.allocationSize = 0;
2571 mem_alloc.memoryTypeIndex = 0;
2572
2573 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2574 ASSERT_VK_SUCCESS(err);
2575
2576 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2577 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002578
2579 // Introduce Failure, select invalid TypeIndex
2580 VkPhysicalDeviceMemoryProperties memory_info;
2581
2582 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2583 unsigned int i;
2584 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2585 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2586 mem_alloc.memoryTypeIndex = i;
2587 break;
2588 }
2589 }
2590 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002591 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002592 vkDestroyImage(m_device->device(), image, NULL);
2593 return;
2594 }
2595
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002597
2598 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2599 ASSERT_VK_SUCCESS(err);
2600
2601 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2602 (void)err;
2603
2604 m_errorMonitor->VerifyFound();
2605
2606 vkDestroyImage(m_device->device(), image, NULL);
2607 vkFreeMemory(m_device->device(), mem, NULL);
2608}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002609
Karl Schultz6addd812016-02-02 17:17:23 -07002610TEST_F(VkLayerTest, BindInvalidMemory) {
2611 VkResult err;
2612 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
Tony Barbour1fa09702017-03-16 12:09:08 -06002614 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002615
Cortf801b982017-01-17 18:10:21 -08002616 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002617 const int32_t tex_width = 256;
2618 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002619
2620 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002621 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2622 image_create_info.pNext = NULL;
2623 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2624 image_create_info.format = tex_format;
2625 image_create_info.extent.width = tex_width;
2626 image_create_info.extent.height = tex_height;
2627 image_create_info.extent.depth = 1;
2628 image_create_info.mipLevels = 1;
2629 image_create_info.arrayLayers = 1;
2630 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002631 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002632 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2633 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002634
Cortf801b982017-01-17 18:10:21 -08002635 VkBufferCreateInfo buffer_create_info = {};
2636 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2637 buffer_create_info.pNext = NULL;
2638 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002639 buffer_create_info.size = 4 * 1024 * 1024;
2640 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002641 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002642
Cortf801b982017-01-17 18:10:21 -08002643 // Create an image/buffer, allocate memory, free it, and then try to bind it
2644 {
2645 VkImage image = VK_NULL_HANDLE;
2646 VkBuffer buffer = VK_NULL_HANDLE;
2647 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2648 ASSERT_VK_SUCCESS(err);
2649 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2650 ASSERT_VK_SUCCESS(err);
2651 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2652 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2653 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002654
Cortf801b982017-01-17 18:10:21 -08002655 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2656 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2657 image_mem_alloc.allocationSize = image_mem_reqs.size;
2658 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2659 ASSERT_TRUE(pass);
2660 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2661 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2662 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2663 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002664
Cortf801b982017-01-17 18:10:21 -08002665 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2666 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2667 ASSERT_VK_SUCCESS(err);
2668 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2669 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002670
Cortf801b982017-01-17 18:10:21 -08002671 vkFreeMemory(device(), image_mem, NULL);
2672 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002673
Cortf801b982017-01-17 18:10:21 -08002674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2675 err = vkBindImageMemory(device(), image, image_mem, 0);
2676 (void)err; // This may very well return an error.
2677 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002678
Cortf801b982017-01-17 18:10:21 -08002679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2680 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2681 (void)err; // This may very well return an error.
2682 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002683
Cortf801b982017-01-17 18:10:21 -08002684 vkDestroyImage(m_device->device(), image, NULL);
2685 vkDestroyBuffer(m_device->device(), buffer, NULL);
2686 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002687
2688 // Try to bind memory to an object that already has a memory binding
2689 {
2690 VkImage image = VK_NULL_HANDLE;
2691 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2692 ASSERT_VK_SUCCESS(err);
2693 VkBuffer buffer = VK_NULL_HANDLE;
2694 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2695 ASSERT_VK_SUCCESS(err);
2696 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2697 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2698 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2699 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2700 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2701 image_alloc_info.allocationSize = image_mem_reqs.size;
2702 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2703 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2704 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2705 ASSERT_TRUE(pass);
2706 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2707 ASSERT_TRUE(pass);
2708 VkDeviceMemory image_mem, buffer_mem;
2709 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2710 ASSERT_VK_SUCCESS(err);
2711 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2712 ASSERT_VK_SUCCESS(err);
2713
2714 err = vkBindImageMemory(device(), image, image_mem, 0);
2715 ASSERT_VK_SUCCESS(err);
2716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2717 err = vkBindImageMemory(device(), image, image_mem, 0);
2718 (void)err; // This may very well return an error.
2719 m_errorMonitor->VerifyFound();
2720
2721 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2722 ASSERT_VK_SUCCESS(err);
2723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2724 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2725 (void)err; // This may very well return an error.
2726 m_errorMonitor->VerifyFound();
2727
2728 vkFreeMemory(device(), image_mem, NULL);
2729 vkFreeMemory(device(), buffer_mem, NULL);
2730 vkDestroyImage(device(), image, NULL);
2731 vkDestroyBuffer(device(), buffer, NULL);
2732 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002733
Cort Strattonde748202017-02-17 12:50:01 -08002734 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002735 {
2736 VkImage image = VK_NULL_HANDLE;
2737 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2738 ASSERT_VK_SUCCESS(err);
2739 VkBuffer buffer = VK_NULL_HANDLE;
2740 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2741 ASSERT_VK_SUCCESS(err);
2742 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2743 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2744 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2745 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2746 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002747 // Leave some extra space for alignment wiggle room
2748 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002749 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002750 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002751 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2752 ASSERT_TRUE(pass);
2753 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2754 ASSERT_TRUE(pass);
2755 VkDeviceMemory image_mem, buffer_mem;
2756 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2757 ASSERT_VK_SUCCESS(err);
2758 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2759 ASSERT_VK_SUCCESS(err);
2760
Cort Strattonde748202017-02-17 12:50:01 -08002761 // Test unaligned memory offset
2762 {
2763 if (image_mem_reqs.alignment > 1) {
2764 VkDeviceSize image_offset = 1;
2765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2766 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2767 (void)err; // This may very well return an error.
2768 m_errorMonitor->VerifyFound();
2769 }
Cort6c7dff72017-01-27 18:34:50 -08002770
Cort Strattonde748202017-02-17 12:50:01 -08002771 if (buffer_mem_reqs.alignment > 1) {
2772 VkDeviceSize buffer_offset = 1;
2773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2774 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2775 (void)err; // This may very well return an error.
2776 m_errorMonitor->VerifyFound();
2777 }
2778 }
2779
2780 // Test memory offsets outside the memory allocation
2781 {
2782 VkDeviceSize image_offset =
2783 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2785 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2786 (void)err; // This may very well return an error.
2787 m_errorMonitor->VerifyFound();
2788
2789 VkDeviceSize buffer_offset =
2790 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2792 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2793 (void)err; // This may very well return an error.
2794 m_errorMonitor->VerifyFound();
2795 }
2796
2797 // Test memory offsets within the memory allocation, but which leave too little memory for
2798 // the resource.
2799 {
2800 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002801 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2803 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2804 (void)err; // This may very well return an error.
2805 m_errorMonitor->VerifyFound();
2806 }
2807
2808 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2809 if (buffer_offset > 0) {
2810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2811 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2812 (void)err; // This may very well return an error.
2813 m_errorMonitor->VerifyFound();
2814 }
2815 }
Cort6c7dff72017-01-27 18:34:50 -08002816
2817 vkFreeMemory(device(), image_mem, NULL);
2818 vkFreeMemory(device(), buffer_mem, NULL);
2819 vkDestroyImage(device(), image, NULL);
2820 vkDestroyBuffer(device(), buffer, NULL);
2821 }
2822
Cort Stratton4c38bb52017-01-28 13:33:10 -08002823 // Try to bind memory to an object with an invalid memory type
2824 {
2825 VkImage image = VK_NULL_HANDLE;
2826 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2827 ASSERT_VK_SUCCESS(err);
2828 VkBuffer buffer = VK_NULL_HANDLE;
2829 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2830 ASSERT_VK_SUCCESS(err);
2831 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2832 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2833 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2834 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2835 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2836 image_alloc_info.allocationSize = image_mem_reqs.size;
2837 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2838 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 // Create a mask of available memory types *not* supported by these resources,
2840 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002841 VkPhysicalDeviceMemoryProperties memory_properties = {};
2842 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002843 VkDeviceMemory image_mem, buffer_mem;
2844
Cort Stratton4c38bb52017-01-28 13:33:10 -08002845 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002846 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002847 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2848 ASSERT_TRUE(pass);
2849 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2850 ASSERT_VK_SUCCESS(err);
2851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2852 err = vkBindImageMemory(device(), image, image_mem, 0);
2853 (void)err; // This may very well return an error.
2854 m_errorMonitor->VerifyFound();
2855 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002856 }
2857
Cort Stratton4c38bb52017-01-28 13:33:10 -08002858 uint32_t buffer_unsupported_mem_type_bits =
2859 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002860 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002861 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2862 ASSERT_TRUE(pass);
2863 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2864 ASSERT_VK_SUCCESS(err);
2865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2866 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2867 (void)err; // This may very well return an error.
2868 m_errorMonitor->VerifyFound();
2869 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002870 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002871
Cort Stratton4c38bb52017-01-28 13:33:10 -08002872 vkDestroyImage(device(), image, NULL);
2873 vkDestroyBuffer(device(), buffer, NULL);
2874 }
2875
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002876 // Try to bind memory to an image created with sparse memory flags
2877 {
2878 VkImageCreateInfo sparse_image_create_info = image_create_info;
2879 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2880 VkImageFormatProperties image_format_properties = {};
2881 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2882 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2883 sparse_image_create_info.usage, sparse_image_create_info.flags,
2884 &image_format_properties);
2885 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2886 // most likely means sparse formats aren't supported here; skip this test.
2887 } else {
2888 ASSERT_VK_SUCCESS(err);
2889 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002890 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002891 return;
2892 } else {
2893 VkImage sparse_image = VK_NULL_HANDLE;
2894 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2895 ASSERT_VK_SUCCESS(err);
2896 VkMemoryRequirements sparse_mem_reqs = {};
2897 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2898 if (sparse_mem_reqs.memoryTypeBits != 0) {
2899 VkMemoryAllocateInfo sparse_mem_alloc = {};
2900 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2901 sparse_mem_alloc.pNext = NULL;
2902 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2903 sparse_mem_alloc.memoryTypeIndex = 0;
2904 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2905 ASSERT_TRUE(pass);
2906 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2907 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2908 ASSERT_VK_SUCCESS(err);
2909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2910 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2911 // This may very well return an error.
2912 (void)err;
2913 m_errorMonitor->VerifyFound();
2914 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2915 }
2916 vkDestroyImage(m_device->device(), sparse_image, NULL);
2917 }
2918 }
2919 }
2920
2921 // Try to bind memory to a buffer created with sparse memory flags
2922 {
2923 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2924 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2925 if (!m_device->phy().features().sparseResidencyBuffer) {
2926 // most likely means sparse formats aren't supported here; skip this test.
2927 } else {
2928 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2929 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2930 ASSERT_VK_SUCCESS(err);
2931 VkMemoryRequirements sparse_mem_reqs = {};
2932 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2933 if (sparse_mem_reqs.memoryTypeBits != 0) {
2934 VkMemoryAllocateInfo sparse_mem_alloc = {};
2935 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2936 sparse_mem_alloc.pNext = NULL;
2937 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2938 sparse_mem_alloc.memoryTypeIndex = 0;
2939 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2940 ASSERT_TRUE(pass);
2941 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2942 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2943 ASSERT_VK_SUCCESS(err);
2944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2945 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2946 // This may very well return an error.
2947 (void)err;
2948 m_errorMonitor->VerifyFound();
2949 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2950 }
2951 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2952 }
2953 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002954}
2955
Karl Schultz6addd812016-02-02 17:17:23 -07002956TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2957 VkResult err;
2958 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002959
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002961
Tony Barbour1fa09702017-03-16 12:09:08 -06002962 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Karl Schultz6addd812016-02-02 17:17:23 -07002964 // Create an image object, allocate memory, destroy the object and then try
2965 // to bind it
2966 VkImage image;
2967 VkDeviceMemory mem;
2968 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002969
Karl Schultz6addd812016-02-02 17:17:23 -07002970 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2971 const int32_t tex_width = 32;
2972 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002973
2974 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002975 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2976 image_create_info.pNext = NULL;
2977 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2978 image_create_info.format = tex_format;
2979 image_create_info.extent.width = tex_width;
2980 image_create_info.extent.height = tex_height;
2981 image_create_info.extent.depth = 1;
2982 image_create_info.mipLevels = 1;
2983 image_create_info.arrayLayers = 1;
2984 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2985 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2986 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2987 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002988
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002989 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002990 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2991 mem_alloc.pNext = NULL;
2992 mem_alloc.allocationSize = 0;
2993 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002994
Chia-I Wuf7458c52015-10-26 21:10:41 +08002995 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002996 ASSERT_VK_SUCCESS(err);
2997
Karl Schultz6addd812016-02-02 17:17:23 -07002998 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002999
3000 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003001 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003002 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003003
3004 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003005 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003006 ASSERT_VK_SUCCESS(err);
3007
3008 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003009 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003010 ASSERT_VK_SUCCESS(err);
3011
3012 // Now Try to bind memory to this destroyed object
3013 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3014 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003015 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003016
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003017 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003018
Chia-I Wuf7458c52015-10-26 21:10:41 +08003019 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003020}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003021
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003022TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3023 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3024
Tony Barbour1fa09702017-03-16 12:09:08 -06003025 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3027
3028 VkVertexInputBindingDescription input_binding;
3029 memset(&input_binding, 0, sizeof(input_binding));
3030
3031 VkVertexInputAttributeDescription input_attribs;
3032 memset(&input_attribs, 0, sizeof(input_attribs));
3033
3034 // Pick a really bad format for this purpose and make sure it should fail
3035 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3036 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3037 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003038 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003039 return;
3040 }
3041
3042 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003043 char const *vsSource =
3044 "#version 450\n"
3045 "\n"
3046 "out gl_PerVertex {\n"
3047 " vec4 gl_Position;\n"
3048 "};\n"
3049 "void main(){\n"
3050 " gl_Position = vec4(1);\n"
3051 "}\n";
3052 char const *fsSource =
3053 "#version 450\n"
3054 "\n"
3055 "layout(location=0) out vec4 color;\n"
3056 "void main(){\n"
3057 " color = vec4(1);\n"
3058 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003059
3060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3061 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3062 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3063
3064 VkPipelineObj pipe(m_device);
3065 pipe.AddColorAttachment();
3066 pipe.AddShader(&vs);
3067 pipe.AddShader(&fs);
3068
3069 pipe.AddVertexInputBindings(&input_binding, 1);
3070 pipe.AddVertexInputAttribs(&input_attribs, 1);
3071
3072 VkDescriptorSetObj descriptorSet(m_device);
3073 descriptorSet.AppendDummy();
3074 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3075
3076 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3077
3078 m_errorMonitor->VerifyFound();
3079}
3080
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003081TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003082 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003083 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003084
3085 VkMemoryPropertyFlags reqs = 0;
3086 VkImageCreateInfo image_create_info = {};
3087 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3088 image_create_info.pNext = NULL;
3089 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3090 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3091 image_create_info.extent.width = 256;
3092 image_create_info.extent.height = 256;
3093 image_create_info.extent.depth = 1;
3094 image_create_info.mipLevels = 1;
3095 image_create_info.arrayLayers = 1;
3096 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3097 image_create_info.flags = 0;
3098
3099 VkImageBlit blit_region = {};
3100 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3101 blit_region.srcSubresource.baseArrayLayer = 0;
3102 blit_region.srcSubresource.layerCount = 1;
3103 blit_region.srcSubresource.mipLevel = 0;
3104 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3105 blit_region.dstSubresource.baseArrayLayer = 0;
3106 blit_region.dstSubresource.layerCount = 1;
3107 blit_region.dstSubresource.mipLevel = 0;
3108
3109 // Create two images, the source with sampleCount = 2, and attempt to blit
3110 // between them
3111 {
3112 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003115 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003117 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003118 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003119 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003121 m_errorMonitor->SetDesiredFailureMsg(
3122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3123 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003124 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3125 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003126 m_errorMonitor->VerifyFound();
3127 m_commandBuffer->EndCommandBuffer();
3128 }
3129
3130 // Create two images, the dest with sampleCount = 4, and attempt to blit
3131 // between them
3132 {
3133 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003134 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003135 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003136 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003137 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003138 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003139 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003140 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003141 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003142 m_errorMonitor->SetDesiredFailureMsg(
3143 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3144 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003145 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3146 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003147 m_errorMonitor->VerifyFound();
3148 m_commandBuffer->EndCommandBuffer();
3149 }
3150
3151 VkBufferImageCopy copy_region = {};
3152 copy_region.bufferRowLength = 128;
3153 copy_region.bufferImageHeight = 128;
3154 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3155 copy_region.imageSubresource.layerCount = 1;
3156 copy_region.imageExtent.height = 64;
3157 copy_region.imageExtent.width = 64;
3158 copy_region.imageExtent.depth = 1;
3159
3160 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3161 // buffer to image
3162 {
3163 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003164 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3165 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003166 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003168 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003169 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003170 m_errorMonitor->SetDesiredFailureMsg(
3171 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3172 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003173 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3174 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003175 m_errorMonitor->VerifyFound();
3176 m_commandBuffer->EndCommandBuffer();
3177 }
3178
3179 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3180 // image to buffer
3181 {
3182 vk_testing::Buffer dst_buffer;
3183 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3184 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003185 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003186 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003187 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003188 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003189 m_errorMonitor->SetDesiredFailureMsg(
3190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3191 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003192 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003193 dst_buffer.handle(), 1, &copy_region);
3194 m_errorMonitor->VerifyFound();
3195 m_commandBuffer->EndCommandBuffer();
3196 }
3197}
3198
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003199TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003200 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003201
3202 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003203 src_image.Init(64, 64, 1, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003204 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003205 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003206 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003207 dst_image2.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003208
3209 VkImageBlit blitRegion = {};
3210 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3211 blitRegion.srcSubresource.baseArrayLayer = 0;
3212 blitRegion.srcSubresource.layerCount = 1;
3213 blitRegion.srcSubresource.mipLevel = 0;
3214 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3215 blitRegion.dstSubresource.baseArrayLayer = 0;
3216 blitRegion.dstSubresource.layerCount = 1;
3217 blitRegion.dstSubresource.mipLevel = 0;
3218
Dave Houlton34df4cb2016-12-01 16:43:06 -07003219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3220
3221 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3222 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003223
3224 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003225 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003226 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003227 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003228
3229 m_errorMonitor->VerifyFound();
3230
Dave Houlton34df4cb2016-12-01 16:43:06 -07003231 // Test should generate 2 VU failures
3232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003234
3235 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003236 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003237 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003238
Dave Houlton34df4cb2016-12-01 16:43:06 -07003239 // TODO: Note that this only verifies that at least one of the VU enums was found
3240 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003241 m_errorMonitor->VerifyFound();
3242
Tony Barbour552f6c02016-12-21 14:34:07 -07003243 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003244}
3245
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003246TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3247 VkResult err;
3248 bool pass;
3249
3250 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003251 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003252
3253 // If w/d/h granularity is 1, test is not meaningful
3254 // TODO: When virtual device limits are available, create a set of limits for this test that
3255 // will always have a granularity of > 1 for w, h, and d
3256 auto index = m_device->graphics_queue_node_index_;
3257 auto queue_family_properties = m_device->phy().queue_properties();
3258
3259 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3260 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3261 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3262 return;
3263 }
3264
3265 // Create two images of different types and try to copy between them
3266 VkImage srcImage;
3267 VkImage dstImage;
3268 VkDeviceMemory srcMem;
3269 VkDeviceMemory destMem;
3270 VkMemoryRequirements memReqs;
3271
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003272 VkImageCreateInfo image_create_info = {};
3273 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3274 image_create_info.pNext = NULL;
3275 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3276 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3277 image_create_info.extent.width = 32;
3278 image_create_info.extent.height = 32;
3279 image_create_info.extent.depth = 1;
3280 image_create_info.mipLevels = 1;
3281 image_create_info.arrayLayers = 4;
3282 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3283 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3284 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3285 image_create_info.flags = 0;
3286
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003287 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003288 ASSERT_VK_SUCCESS(err);
3289
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003290 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003291 ASSERT_VK_SUCCESS(err);
3292
3293 // Allocate memory
3294 VkMemoryAllocateInfo memAlloc = {};
3295 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3296 memAlloc.pNext = NULL;
3297 memAlloc.allocationSize = 0;
3298 memAlloc.memoryTypeIndex = 0;
3299
3300 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3301 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003302 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003303 ASSERT_TRUE(pass);
3304 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3305 ASSERT_VK_SUCCESS(err);
3306
3307 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3308 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003309 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003310 ASSERT_VK_SUCCESS(err);
3311 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3312 ASSERT_VK_SUCCESS(err);
3313
3314 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3315 ASSERT_VK_SUCCESS(err);
3316 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3317 ASSERT_VK_SUCCESS(err);
3318
Tony Barbour552f6c02016-12-21 14:34:07 -07003319 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003320 VkImageCopy copyRegion;
3321 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3322 copyRegion.srcSubresource.mipLevel = 0;
3323 copyRegion.srcSubresource.baseArrayLayer = 0;
3324 copyRegion.srcSubresource.layerCount = 1;
3325 copyRegion.srcOffset.x = 0;
3326 copyRegion.srcOffset.y = 0;
3327 copyRegion.srcOffset.z = 0;
3328 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3329 copyRegion.dstSubresource.mipLevel = 0;
3330 copyRegion.dstSubresource.baseArrayLayer = 0;
3331 copyRegion.dstSubresource.layerCount = 1;
3332 copyRegion.dstOffset.x = 0;
3333 copyRegion.dstOffset.y = 0;
3334 copyRegion.dstOffset.z = 0;
3335 copyRegion.extent.width = 1;
3336 copyRegion.extent.height = 1;
3337 copyRegion.extent.depth = 1;
3338
3339 // Introduce failure by setting srcOffset to a bad granularity value
3340 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3342 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003343 m_errorMonitor->VerifyFound();
3344
3345 // Introduce failure by setting extent to a bad granularity value
3346 copyRegion.srcOffset.y = 0;
3347 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3349 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003350 m_errorMonitor->VerifyFound();
3351
3352 // Now do some buffer/image copies
3353 vk_testing::Buffer buffer;
3354 VkMemoryPropertyFlags reqs = 0;
3355 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3356 VkBufferImageCopy region = {};
3357 region.bufferOffset = 0;
3358 region.bufferRowLength = 3;
3359 region.bufferImageHeight = 128;
3360 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3361 region.imageSubresource.layerCount = 1;
3362 region.imageExtent.height = 16;
3363 region.imageExtent.width = 16;
3364 region.imageExtent.depth = 1;
3365 region.imageOffset.x = 0;
3366 region.imageOffset.y = 0;
3367 region.imageOffset.z = 0;
3368
3369 // Introduce failure by setting bufferRowLength to a bad granularity value
3370 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3372 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3373 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003374 m_errorMonitor->VerifyFound();
3375 region.bufferRowLength = 128;
3376
3377 // Introduce failure by setting bufferOffset to a bad granularity value
3378 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3380 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3381 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003382 m_errorMonitor->VerifyFound();
3383 region.bufferOffset = 0;
3384
3385 // Introduce failure by setting bufferImageHeight to a bad granularity value
3386 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3389 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003390 m_errorMonitor->VerifyFound();
3391 region.bufferImageHeight = 128;
3392
3393 // Introduce failure by setting imageExtent to a bad granularity value
3394 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3396 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3397 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003398 m_errorMonitor->VerifyFound();
3399 region.imageExtent.width = 16;
3400
3401 // Introduce failure by setting imageOffset to a bad granularity value
3402 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3404 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3405 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003406 m_errorMonitor->VerifyFound();
3407
Tony Barbour552f6c02016-12-21 14:34:07 -07003408 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003409
3410 vkDestroyImage(m_device->device(), srcImage, NULL);
3411 vkDestroyImage(m_device->device(), dstImage, NULL);
3412 vkFreeMemory(m_device->device(), srcMem, NULL);
3413 vkFreeMemory(m_device->device(), destMem, NULL);
3414}
3415
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003416TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003417 TEST_DESCRIPTION(
3418 "Submit command buffer created using one queue family and "
3419 "attempt to submit them on a queue created in a different "
3420 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003421
Tony Barbour1fa09702017-03-16 12:09:08 -06003422 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003423
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003424 // This test is meaningless unless we have multiple queue families
3425 auto queue_family_properties = m_device->phy().queue_properties();
3426 if (queue_family_properties.size() < 2) {
3427 return;
3428 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003430 // Get safe index of another queue family
3431 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003432 VkQueue other_queue;
3433 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3434
3435 // Record an empty cmd buffer
3436 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3437 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3438 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3439 vkEndCommandBuffer(m_commandBuffer->handle());
3440
3441 // And submit on the wrong queue
3442 VkSubmitInfo submit_info = {};
3443 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3444 submit_info.commandBufferCount = 1;
3445 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003446 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003447
3448 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003449}
3450
Chris Forbes4c24a922016-11-16 08:59:10 +13003451TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003453
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003454 // There are no attachments, but refer to attachment 0.
3455 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003456 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003457 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003458 };
3459
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003460 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003461 VkRenderPass rp;
3462
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003463 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003465 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3466 m_errorMonitor->VerifyFound();
3467}
3468
Chris Forbesa58c4522016-09-28 15:19:39 +13003469TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3470 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003471 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003472
3473 // A renderpass with two subpasses, both writing the same attachment.
3474 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003475 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3476 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3477 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003478 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003479 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003480 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003481 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3482 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003483 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003484 VkSubpassDependency dep = {0,
3485 1,
3486 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3487 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3488 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3489 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3490 VK_DEPENDENCY_BY_REGION_BIT};
3491 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003492 VkRenderPass rp;
3493 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3494 ASSERT_VK_SUCCESS(err);
3495
3496 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003497 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003498 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3499
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003500 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003501 VkFramebuffer fb;
3502 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3503 ASSERT_VK_SUCCESS(err);
3504
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003505 char const *vsSource =
3506 "#version 450\n"
3507 "void main() { gl_Position = vec4(1); }\n";
3508 char const *fsSource =
3509 "#version 450\n"
3510 "layout(location=0) out vec4 color;\n"
3511 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003512
3513 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3514 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3515 VkPipelineObj pipe(m_device);
3516 pipe.AddColorAttachment();
3517 pipe.AddShader(&vs);
3518 pipe.AddShader(&fs);
3519 VkViewport view_port = {};
3520 m_viewports.push_back(view_port);
3521 pipe.SetViewport(m_viewports);
3522 VkRect2D rect = {};
3523 m_scissors.push_back(rect);
3524 pipe.SetScissor(m_scissors);
3525
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003526 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003527 VkPipelineLayout pl;
3528 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3529 ASSERT_VK_SUCCESS(err);
3530 pipe.CreateVKPipeline(pl, rp);
3531
Tony Barbour552f6c02016-12-21 14:34:07 -07003532 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003533
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003534 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3535 nullptr,
3536 rp,
3537 fb,
3538 {{
3539 0, 0,
3540 },
3541 {32, 32}},
3542 0,
3543 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003544
3545 // subtest 1: bind in the wrong subpass
3546 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3547 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003549 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3550 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3551 m_errorMonitor->VerifyFound();
3552
3553 vkCmdEndRenderPass(m_commandBuffer->handle());
3554
3555 // subtest 2: bind in correct subpass, then transition to next subpass
3556 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3557 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3558 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003560 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3561 m_errorMonitor->VerifyFound();
3562
3563 vkCmdEndRenderPass(m_commandBuffer->handle());
3564
Tony Barbour552f6c02016-12-21 14:34:07 -07003565 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003566
3567 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3568 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3569 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3570}
3571
Tony Barbour4e919972016-08-09 13:27:40 -06003572TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 TEST_DESCRIPTION(
3574 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3575 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003576 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3578
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3580 "Cannot execute a render pass with renderArea "
3581 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003582
3583 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3584 m_renderPassBeginInfo.renderArea.extent.width = 257;
3585 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003586 m_commandBuffer->BeginCommandBuffer();
3587 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003588 m_errorMonitor->VerifyFound();
3589}
3590
3591TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003592 TEST_DESCRIPTION(
3593 "Generate INDEPENDENT_BLEND by disabling independent "
3594 "blend and then specifying different blend states for two "
3595 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003596 VkPhysicalDeviceFeatures features = {};
3597 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003598 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003599
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3601 "Invalid Pipeline CreateInfo: If independent blend feature not "
3602 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003603
Cody Northropc31a84f2016-08-22 10:41:47 -06003604 VkDescriptorSetObj descriptorSet(m_device);
3605 descriptorSet.AppendDummy();
3606 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003607
Cody Northropc31a84f2016-08-22 10:41:47 -06003608 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003609 // Create a renderPass with two color attachments
3610 VkAttachmentReference attachments[2] = {};
3611 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003612 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003613 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3614
3615 VkSubpassDescription subpass = {};
3616 subpass.pColorAttachments = attachments;
3617 subpass.colorAttachmentCount = 2;
3618
3619 VkRenderPassCreateInfo rpci = {};
3620 rpci.subpassCount = 1;
3621 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003622 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003623
Tony Barbourffd60bd2017-03-09 12:04:55 -07003624 VkAttachmentDescription attach_desc[2] = {};
3625 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3626 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3627 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3628 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3629 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3630 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3631 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3632 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003633
Tony Barbourffd60bd2017-03-09 12:04:55 -07003634 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003635 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3636
3637 VkRenderPass renderpass;
3638 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003639 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003640 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003641
Cody Northropc31a84f2016-08-22 10:41:47 -06003642 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3643 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3644 att_state1.blendEnable = VK_TRUE;
3645 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3646 att_state2.blendEnable = VK_FALSE;
3647 pipeline.AddColorAttachment(0, &att_state1);
3648 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003649 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003650 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003651 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003652}
3653
Mike Weiblen40b160e2017-02-06 19:21:52 -07003654// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3655TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3656 TEST_DESCRIPTION(
3657 "Create a graphics pipeline that is incompatible with the requirements "
3658 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003659 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003660
3661 VkDescriptorSetObj ds_obj(m_device);
3662 ds_obj.AppendDummy();
3663 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3664
3665 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3666
3667 VkPipelineColorBlendAttachmentState att_state1 = {};
3668 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3669 att_state1.blendEnable = VK_TRUE;
3670
3671 VkRenderpassObj rp_obj(m_device);
3672
3673 {
3674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3675 VkPipelineObj pipeline(m_device);
3676 pipeline.AddShader(&vs_obj);
3677 pipeline.AddColorAttachment(0, &att_state1);
3678
3679 VkGraphicsPipelineCreateInfo info = {};
3680 pipeline.InitGraphicsPipelineCreateInfo(&info);
3681 info.pColorBlendState = nullptr;
3682
3683 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3684 m_errorMonitor->VerifyFound();
3685 }
3686}
3687
Chris Forbes26ec2122016-11-29 08:58:33 +13003688#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003689TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3690 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3691 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003692 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003693
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3695 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003696
3697 // Create a renderPass with a single color attachment
3698 VkAttachmentReference attach = {};
3699 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3700 VkSubpassDescription subpass = {};
3701 VkRenderPassCreateInfo rpci = {};
3702 rpci.subpassCount = 1;
3703 rpci.pSubpasses = &subpass;
3704 rpci.attachmentCount = 1;
3705 VkAttachmentDescription attach_desc = {};
3706 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3707 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3708 rpci.pAttachments = &attach_desc;
3709 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3710 VkRenderPass rp;
3711 subpass.pDepthStencilAttachment = &attach;
3712 subpass.pColorAttachments = NULL;
3713 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3714 m_errorMonitor->VerifyFound();
3715}
Chris Forbes26ec2122016-11-29 08:58:33 +13003716#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003717
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003718TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003719 TEST_DESCRIPTION(
3720 "Create a framebuffer where a subpass has a preserve "
3721 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003722
Tony Barbour1fa09702017-03-16 12:09:08 -06003723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3725
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003727
3728 VkAttachmentReference color_attach = {};
3729 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3730 color_attach.attachment = 0;
3731 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3732 VkSubpassDescription subpass = {};
3733 subpass.colorAttachmentCount = 1;
3734 subpass.pColorAttachments = &color_attach;
3735 subpass.preserveAttachmentCount = 1;
3736 subpass.pPreserveAttachments = &preserve_attachment;
3737
3738 VkRenderPassCreateInfo rpci = {};
3739 rpci.subpassCount = 1;
3740 rpci.pSubpasses = &subpass;
3741 rpci.attachmentCount = 1;
3742 VkAttachmentDescription attach_desc = {};
3743 attach_desc.format = VK_FORMAT_UNDEFINED;
3744 rpci.pAttachments = &attach_desc;
3745 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3746 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003747 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003748
3749 m_errorMonitor->VerifyFound();
3750
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003751 if (result == VK_SUCCESS) {
3752 vkDestroyRenderPass(m_device->device(), rp, NULL);
3753 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003754}
3755
Chris Forbesc5389742016-06-29 11:49:23 +12003756TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003757 TEST_DESCRIPTION(
3758 "Ensure that CreateRenderPass produces a validation error "
3759 "when the source of a subpass multisample resolve "
3760 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003761
Tony Barbour1fa09702017-03-16 12:09:08 -06003762 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003763
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3765 "Subpass 0 requests multisample resolve from attachment 0 which has "
3766 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003767
3768 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003769 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3770 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3771 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3772 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3773 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3774 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003775 };
3776
3777 VkAttachmentReference color = {
3778 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3779 };
3780
3781 VkAttachmentReference resolve = {
3782 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3783 };
3784
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003785 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003787 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003788
3789 VkRenderPass rp;
3790 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3791
3792 m_errorMonitor->VerifyFound();
3793
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003794 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003795}
3796
3797TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003798 TEST_DESCRIPTION(
3799 "Ensure CreateRenderPass produces a validation error "
3800 "when a subpass multisample resolve operation is "
3801 "requested, and the destination of that resolve has "
3802 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003803
Tony Barbour1fa09702017-03-16 12:09:08 -06003804 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003805
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3807 "Subpass 0 requests multisample resolve into attachment 1, which "
3808 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003809
3810 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003811 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3812 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3813 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3814 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3815 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3816 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003817 };
3818
3819 VkAttachmentReference color = {
3820 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3821 };
3822
3823 VkAttachmentReference resolve = {
3824 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3825 };
3826
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003827 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003828
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003829 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003830
3831 VkRenderPass rp;
3832 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3833
3834 m_errorMonitor->VerifyFound();
3835
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003836 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003837}
3838
Chris Forbes3f128ef2016-06-29 14:58:53 +12003839TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003840 TEST_DESCRIPTION(
3841 "Ensure CreateRenderPass produces a validation error "
3842 "when the color and depth attachments used by a subpass "
3843 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003844
Tony Barbour1fa09702017-03-16 12:09:08 -06003845 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003846
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3848 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003849
3850 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003851 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3852 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3853 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3854 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3855 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3856 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003857 };
3858
3859 VkAttachmentReference color[] = {
3860 {
3861 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3862 },
3863 {
3864 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3865 },
3866 };
3867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003868 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003869
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003870 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003871
3872 VkRenderPass rp;
3873 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3874
3875 m_errorMonitor->VerifyFound();
3876
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003877 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003878}
3879
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003880TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003881 TEST_DESCRIPTION(
3882 "Hit errors when attempting to create a framebuffer :\n"
3883 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3884 " 2. Use a color image as depthStencil attachment\n"
3885 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3886 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3887 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3888 " 6. Framebuffer attachment where dimensions don't match\n"
3889 " 7. Framebuffer attachment w/o identity swizzle\n"
3890 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003891
Tony Barbour1fa09702017-03-16 12:09:08 -06003892 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003893 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3894
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003895 m_errorMonitor->SetDesiredFailureMsg(
3896 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3897 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003898
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003899 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003900 VkAttachmentReference attach = {};
3901 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3902 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003903 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003904 VkRenderPassCreateInfo rpci = {};
3905 rpci.subpassCount = 1;
3906 rpci.pSubpasses = &subpass;
3907 rpci.attachmentCount = 1;
3908 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003909 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003910 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003911 rpci.pAttachments = &attach_desc;
3912 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3913 VkRenderPass rp;
3914 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3915 ASSERT_VK_SUCCESS(err);
3916
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003917 VkImageView ivs[2];
3918 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3919 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003920 VkFramebufferCreateInfo fb_info = {};
3921 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3922 fb_info.pNext = NULL;
3923 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003924 // Set mis-matching attachmentCount
3925 fb_info.attachmentCount = 2;
3926 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003927 fb_info.width = 100;
3928 fb_info.height = 100;
3929 fb_info.layers = 1;
3930
3931 VkFramebuffer fb;
3932 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3933
3934 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003935 if (err == VK_SUCCESS) {
3936 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3937 }
3938 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003939
3940 // Create a renderPass with a depth-stencil attachment created with
3941 // IMAGE_USAGE_COLOR_ATTACHMENT
3942 // Add our color attachment to pDepthStencilAttachment
3943 subpass.pDepthStencilAttachment = &attach;
3944 subpass.pColorAttachments = NULL;
3945 VkRenderPass rp_ds;
3946 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3947 ASSERT_VK_SUCCESS(err);
3948 // Set correct attachment count, but attachment has COLOR usage bit set
3949 fb_info.attachmentCount = 1;
3950 fb_info.renderPass = rp_ds;
3951
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003953 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3954
3955 m_errorMonitor->VerifyFound();
3956 if (err == VK_SUCCESS) {
3957 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3958 }
3959 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003960
3961 // Create new renderpass with alternate attachment format from fb
3962 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3963 subpass.pDepthStencilAttachment = NULL;
3964 subpass.pColorAttachments = &attach;
3965 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3966 ASSERT_VK_SUCCESS(err);
3967
3968 // Cause error due to mis-matched formats between rp & fb
3969 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3970 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3972 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003973 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3974
3975 m_errorMonitor->VerifyFound();
3976 if (err == VK_SUCCESS) {
3977 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3978 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003979 vkDestroyRenderPass(m_device->device(), rp, NULL);
3980
3981 // Create new renderpass with alternate sample count from fb
3982 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3983 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3984 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3985 ASSERT_VK_SUCCESS(err);
3986
3987 // Cause error due to mis-matched sample count between rp & fb
3988 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003990 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003991 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3992
3993 m_errorMonitor->VerifyFound();
3994 if (err == VK_SUCCESS) {
3995 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3996 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003997
3998 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003999
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004000 {
4001 // Create an image with 2 mip levels.
4002 VkImageObj image(m_device);
4003 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4004 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004005
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004006 // Create a image view with two mip levels.
4007 VkImageView view;
4008 VkImageViewCreateInfo ivci = {};
4009 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4010 ivci.image = image.handle();
4011 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4012 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4013 ivci.subresourceRange.layerCount = 1;
4014 ivci.subresourceRange.baseMipLevel = 0;
4015 // Set level count to 2 (only 1 is allowed for FB attachment)
4016 ivci.subresourceRange.levelCount = 2;
4017 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4018 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4019 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004020
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004021 // Re-create renderpass to have matching sample count
4022 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4023 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4024 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004025
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004026 fb_info.renderPass = rp;
4027 fb_info.pAttachments = &view;
4028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
4029 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4030
4031 m_errorMonitor->VerifyFound();
4032 if (err == VK_SUCCESS) {
4033 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4034 }
4035 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004036 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004037
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004038 // Update view to original color buffer and grow FB dimensions too big
4039 fb_info.pAttachments = ivs;
4040 fb_info.height = 1024;
4041 fb_info.width = 1024;
4042 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004044 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4045
4046 m_errorMonitor->VerifyFound();
4047 if (err == VK_SUCCESS) {
4048 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4049 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004050
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004051 {
4052 // Create an image with one mip level.
4053 VkImageObj image(m_device);
4054 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4055 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004056
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004057 // Create view attachment with non-identity swizzle
4058 VkImageView view;
4059 VkImageViewCreateInfo ivci = {};
4060 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4061 ivci.image = image.handle();
4062 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4063 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4064 ivci.subresourceRange.layerCount = 1;
4065 ivci.subresourceRange.baseMipLevel = 0;
4066 ivci.subresourceRange.levelCount = 1;
4067 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4068 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4069 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4070 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4071 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4072 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4073 ASSERT_VK_SUCCESS(err);
4074
4075 fb_info.pAttachments = &view;
4076 fb_info.height = 100;
4077 fb_info.width = 100;
4078 fb_info.layers = 1;
4079
4080 m_errorMonitor->SetDesiredFailureMsg(
4081 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4082 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
4083 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4084
4085 m_errorMonitor->VerifyFound();
4086 if (err == VK_SUCCESS) {
4087 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4088 }
4089 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004090 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004091
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004092 // reset attachment to color attachment
4093 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004094
4095 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004096 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004097 fb_info.height = 100;
4098 fb_info.layers = 1;
4099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004100 m_errorMonitor->SetDesiredFailureMsg(
4101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004102 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4103 "Here are the respective dimensions for attachment");
4104
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004105 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4106
4107 m_errorMonitor->VerifyFound();
4108 if (err == VK_SUCCESS) {
4109 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4110 }
4111
4112 // Request fb that exceeds max height
4113 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004114 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004115 fb_info.layers = 1;
4116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004117 m_errorMonitor->SetDesiredFailureMsg(
4118 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004119 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4120 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004121 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4122
4123 m_errorMonitor->VerifyFound();
4124 if (err == VK_SUCCESS) {
4125 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4126 }
4127
4128 // Request fb that exceeds max layers
4129 fb_info.width = 100;
4130 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004131 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004133 m_errorMonitor->SetDesiredFailureMsg(
4134 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004135 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4136 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004137 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4138
4139 m_errorMonitor->VerifyFound();
4140 if (err == VK_SUCCESS) {
4141 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4142 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004143
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004144 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004145}
4146
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004147TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004148 TEST_DESCRIPTION(
4149 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4150 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004151
Tony Barbour1fa09702017-03-16 12:09:08 -06004152 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004153 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4155 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004156 m_errorMonitor->VerifyFound();
4157}
4158
4159TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004160 TEST_DESCRIPTION(
4161 "Run a simple draw calls to validate failure when Line Width dynamic "
4162 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004163
Tony Barbour1fa09702017-03-16 12:09:08 -06004164 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004165 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4167 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004168 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004169}
4170
4171TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004172 TEST_DESCRIPTION(
4173 "Run a simple draw calls to validate failure when Viewport dynamic "
4174 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004175
Tony Barbour1fa09702017-03-16 12:09:08 -06004176 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004177 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4179 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004180 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004181 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004182}
4183
4184TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004185 TEST_DESCRIPTION(
4186 "Run a simple draw calls to validate failure when Scissor dynamic "
4187 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004188
Tony Barbour1fa09702017-03-16 12:09:08 -06004189 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004190 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4192 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004193 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004194 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004195}
4196
Cortd713fe82016-07-27 09:51:27 -07004197TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004198 TEST_DESCRIPTION(
4199 "Run a simple draw calls to validate failure when Blend Constants "
4200 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004201
Tony Barbour1fa09702017-03-16 12:09:08 -06004202 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004203 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4205 "Dynamic blend constants state not set for this command buffer");
4206 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004207 m_errorMonitor->VerifyFound();
4208}
4209
4210TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004211 TEST_DESCRIPTION(
4212 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4213 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004214
Tony Barbour1fa09702017-03-16 12:09:08 -06004215 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004216 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004217 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004218 return;
4219 }
4220 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4222 "Dynamic depth bounds state not set for this command buffer");
4223 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004224 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004225}
4226
4227TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004228 TEST_DESCRIPTION(
4229 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4230 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004231
Tony Barbour1fa09702017-03-16 12:09:08 -06004232 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004233 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Dynamic stencil read mask state not set for this command buffer");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004237 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004238}
4239
4240TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004241 TEST_DESCRIPTION(
4242 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4243 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004246 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4248 "Dynamic stencil write mask state not set for this command buffer");
4249 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004250 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004251}
4252
4253TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004254 TEST_DESCRIPTION(
4255 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4256 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004257
Tony Barbour1fa09702017-03-16 12:09:08 -06004258 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004259 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4261 "Dynamic stencil reference state not set for this command buffer");
4262 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004263 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004264}
4265
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004266TEST_F(VkLayerTest, IndexBufferNotBound) {
4267 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004268
Tony Barbour1fa09702017-03-16 12:09:08 -06004269 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4271 "Index buffer object not bound to this command buffer when Indexed ");
4272 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004273 m_errorMonitor->VerifyFound();
4274}
4275
Karl Schultz6addd812016-02-02 17:17:23 -07004276TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4278 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4279 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004280
Tony Barbour1fa09702017-03-16 12:09:08 -06004281 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004282 ASSERT_NO_FATAL_FAILURE(InitViewport());
4283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4284
Karl Schultz6addd812016-02-02 17:17:23 -07004285 // We luck out b/c by default the framework creates CB w/ the
4286 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004287 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004288 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004289 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004290
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004291 // Bypass framework since it does the waits automatically
4292 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004293 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004294 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4295 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004296 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004297 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004298 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004299 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004300 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004301 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004302 submit_info.pSignalSemaphores = NULL;
4303
Chris Forbes40028e22016-06-13 09:59:34 +12004304 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004305 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004306 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004307
Karl Schultz6addd812016-02-02 17:17:23 -07004308 // Cause validation error by re-submitting cmd buffer that should only be
4309 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004310 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004311 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004312
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004313 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004314}
4315
Karl Schultz6addd812016-02-02 17:17:23 -07004316TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004317 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004318 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004319
Tony Barbour1fa09702017-03-16 12:09:08 -06004320 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004321 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004322
Karl Schultz6addd812016-02-02 17:17:23 -07004323 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4324 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004325 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004326 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004327 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004328
4329 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004330 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4331 ds_pool_ci.pNext = NULL;
4332 ds_pool_ci.flags = 0;
4333 ds_pool_ci.maxSets = 1;
4334 ds_pool_ci.poolSizeCount = 1;
4335 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336
4337 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004338 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004339 ASSERT_VK_SUCCESS(err);
4340
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004341 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4342 dsl_binding_samp.binding = 0;
4343 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4344 dsl_binding_samp.descriptorCount = 1;
4345 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4346 dsl_binding_samp.pImmutableSamplers = NULL;
4347
4348 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4349 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4350 ds_layout_ci.pNext = NULL;
4351 ds_layout_ci.bindingCount = 1;
4352 ds_layout_ci.pBindings = &dsl_binding_samp;
4353
4354 VkDescriptorSetLayout ds_layout_samp;
4355 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4356 ASSERT_VK_SUCCESS(err);
4357
4358 // Try to allocate 2 sets when pool only has 1 set
4359 VkDescriptorSet descriptor_sets[2];
4360 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4361 VkDescriptorSetAllocateInfo alloc_info = {};
4362 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4363 alloc_info.descriptorSetCount = 2;
4364 alloc_info.descriptorPool = ds_pool;
4365 alloc_info.pSetLayouts = set_layouts;
4366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4367 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4368 m_errorMonitor->VerifyFound();
4369
4370 alloc_info.descriptorSetCount = 1;
4371 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004372 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004373 dsl_binding.binding = 0;
4374 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4375 dsl_binding.descriptorCount = 1;
4376 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4377 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004378
Karl Schultz6addd812016-02-02 17:17:23 -07004379 ds_layout_ci.bindingCount = 1;
4380 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004381
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004382 VkDescriptorSetLayout ds_layout_ub;
4383 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004384 ASSERT_VK_SUCCESS(err);
4385
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004386 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004387 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004388 alloc_info.pSetLayouts = &ds_layout_ub;
4389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4390 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004392 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004393
Karl Schultz2825ab92016-12-02 08:23:14 -07004394 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004395 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004396 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004397}
4398
Karl Schultz6addd812016-02-02 17:17:23 -07004399TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4400 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004403
Tony Barbour1fa09702017-03-16 12:09:08 -06004404 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004406
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004407 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004408 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4409 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004410
4411 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004412 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4413 ds_pool_ci.pNext = NULL;
4414 ds_pool_ci.maxSets = 1;
4415 ds_pool_ci.poolSizeCount = 1;
4416 ds_pool_ci.flags = 0;
4417 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4418 // app can only call vkResetDescriptorPool on this pool.;
4419 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004420
4421 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004422 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004423 ASSERT_VK_SUCCESS(err);
4424
4425 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004426 dsl_binding.binding = 0;
4427 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4428 dsl_binding.descriptorCount = 1;
4429 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4430 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004431
4432 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004433 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4434 ds_layout_ci.pNext = NULL;
4435 ds_layout_ci.bindingCount = 1;
4436 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004437
4438 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004439 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004440 ASSERT_VK_SUCCESS(err);
4441
4442 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004443 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004444 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004445 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004446 alloc_info.descriptorPool = ds_pool;
4447 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004448 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004449 ASSERT_VK_SUCCESS(err);
4450
4451 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004452 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004453
Chia-I Wuf7458c52015-10-26 21:10:41 +08004454 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4455 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004456}
4457
Karl Schultz6addd812016-02-02 17:17:23 -07004458TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004459 // Attempt to clear Descriptor Pool with bad object.
4460 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004461
Tony Barbour1fa09702017-03-16 12:09:08 -06004462 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004464 uint64_t fake_pool_handle = 0xbaad6001;
4465 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4466 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004467 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004468}
4469
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004470TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004471 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4472 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004473 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004474 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004475
4476 uint64_t fake_set_handle = 0xbaad6001;
4477 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004478 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004480
Tony Barbour1fa09702017-03-16 12:09:08 -06004481 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004482
4483 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4484 layout_bindings[0].binding = 0;
4485 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4486 layout_bindings[0].descriptorCount = 1;
4487 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4488 layout_bindings[0].pImmutableSamplers = NULL;
4489
4490 VkDescriptorSetLayout descriptor_set_layout;
4491 VkDescriptorSetLayoutCreateInfo dslci = {};
4492 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4493 dslci.pNext = NULL;
4494 dslci.bindingCount = 1;
4495 dslci.pBindings = layout_bindings;
4496 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004497 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004498
4499 VkPipelineLayout pipeline_layout;
4500 VkPipelineLayoutCreateInfo plci = {};
4501 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4502 plci.pNext = NULL;
4503 plci.setLayoutCount = 1;
4504 plci.pSetLayouts = &descriptor_set_layout;
4505 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004506 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004507
Tony Barbour552f6c02016-12-21 14:34:07 -07004508 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004509 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4510 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004511 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004512 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004513 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4514 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004515}
4516
Karl Schultz6addd812016-02-02 17:17:23 -07004517TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004518 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4519 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004520 uint64_t fake_layout_handle = 0xbaad6001;
4521 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004523 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004524 VkPipelineLayout pipeline_layout;
4525 VkPipelineLayoutCreateInfo plci = {};
4526 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4527 plci.pNext = NULL;
4528 plci.setLayoutCount = 1;
4529 plci.pSetLayouts = &bad_layout;
4530 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4531
4532 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004533}
4534
Mark Muellerd4914412016-06-13 17:52:06 -06004535TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004536 TEST_DESCRIPTION(
4537 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4538 "1) A uniform buffer update must have a valid buffer index."
4539 "2) When using an array of descriptors in a single WriteDescriptor,"
4540 " the descriptor types and stageflags must all be the same."
4541 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004542
Mike Weiblena6666382017-01-05 15:16:11 -07004543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004544
Tony Barbour1fa09702017-03-16 12:09:08 -06004545 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004546 VkDescriptorPoolSize ds_type_count[4] = {};
4547 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4548 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004549 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004550 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004551 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004552 ds_type_count[2].descriptorCount = 1;
4553 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4554 ds_type_count[3].descriptorCount = 1;
4555
4556 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4557 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4558 ds_pool_ci.maxSets = 1;
4559 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4560 ds_pool_ci.pPoolSizes = ds_type_count;
4561
4562 VkDescriptorPool ds_pool;
4563 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4564 ASSERT_VK_SUCCESS(err);
4565
Mark Muellerb9896722016-06-16 09:54:29 -06004566 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004567 layout_binding[0].binding = 0;
4568 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4569 layout_binding[0].descriptorCount = 1;
4570 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4571 layout_binding[0].pImmutableSamplers = NULL;
4572
4573 layout_binding[1].binding = 1;
4574 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4575 layout_binding[1].descriptorCount = 1;
4576 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4577 layout_binding[1].pImmutableSamplers = NULL;
4578
4579 VkSamplerCreateInfo sampler_ci = {};
4580 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4581 sampler_ci.pNext = NULL;
4582 sampler_ci.magFilter = VK_FILTER_NEAREST;
4583 sampler_ci.minFilter = VK_FILTER_NEAREST;
4584 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4585 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4586 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4587 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4588 sampler_ci.mipLodBias = 1.0;
4589 sampler_ci.anisotropyEnable = VK_FALSE;
4590 sampler_ci.maxAnisotropy = 1;
4591 sampler_ci.compareEnable = VK_FALSE;
4592 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4593 sampler_ci.minLod = 1.0;
4594 sampler_ci.maxLod = 1.0;
4595 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4596 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4597 VkSampler sampler;
4598
4599 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4600 ASSERT_VK_SUCCESS(err);
4601
4602 layout_binding[2].binding = 2;
4603 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4604 layout_binding[2].descriptorCount = 1;
4605 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4606 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4607
Mark Muellerd4914412016-06-13 17:52:06 -06004608 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4609 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4610 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4611 ds_layout_ci.pBindings = layout_binding;
4612 VkDescriptorSetLayout ds_layout;
4613 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4614 ASSERT_VK_SUCCESS(err);
4615
4616 VkDescriptorSetAllocateInfo alloc_info = {};
4617 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4618 alloc_info.descriptorSetCount = 1;
4619 alloc_info.descriptorPool = ds_pool;
4620 alloc_info.pSetLayouts = &ds_layout;
4621 VkDescriptorSet descriptorSet;
4622 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4623 ASSERT_VK_SUCCESS(err);
4624
4625 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4626 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4627 pipeline_layout_ci.pNext = NULL;
4628 pipeline_layout_ci.setLayoutCount = 1;
4629 pipeline_layout_ci.pSetLayouts = &ds_layout;
4630
4631 VkPipelineLayout pipeline_layout;
4632 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4633 ASSERT_VK_SUCCESS(err);
4634
Mark Mueller5c838ce2016-06-16 09:54:29 -06004635 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004636 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4637 descriptor_write.dstSet = descriptorSet;
4638 descriptor_write.dstBinding = 0;
4639 descriptor_write.descriptorCount = 1;
4640 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4641
Mark Mueller5c838ce2016-06-16 09:54:29 -06004642 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004643 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4644 m_errorMonitor->VerifyFound();
4645
4646 // Create a buffer to update the descriptor with
4647 uint32_t qfi = 0;
4648 VkBufferCreateInfo buffCI = {};
4649 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4650 buffCI.size = 1024;
4651 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4652 buffCI.queueFamilyIndexCount = 1;
4653 buffCI.pQueueFamilyIndices = &qfi;
4654
4655 VkBuffer dyub;
4656 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4657 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004658
Tony Barboure132c5f2016-12-12 11:50:20 -07004659 VkDeviceMemory mem;
4660 VkMemoryRequirements mem_reqs;
4661 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4662
4663 VkMemoryAllocateInfo mem_alloc_info = {};
4664 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4665 mem_alloc_info.allocationSize = mem_reqs.size;
4666 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4667 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4668 ASSERT_VK_SUCCESS(err);
4669
4670 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4671 ASSERT_VK_SUCCESS(err);
4672
4673 VkDescriptorBufferInfo buffInfo[2] = {};
4674 buffInfo[0].buffer = dyub;
4675 buffInfo[0].offset = 0;
4676 buffInfo[0].range = 1024;
4677 buffInfo[1].buffer = dyub;
4678 buffInfo[1].offset = 0;
4679 buffInfo[1].range = 1024;
4680 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004681 descriptor_write.descriptorCount = 2;
4682
Mark Mueller5c838ce2016-06-16 09:54:29 -06004683 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004685 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4686 m_errorMonitor->VerifyFound();
4687
Mark Mueller5c838ce2016-06-16 09:54:29 -06004688 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4689 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004690 descriptor_write.dstBinding = 1;
4691 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004692
Mark Mueller5c838ce2016-06-16 09:54:29 -06004693 // Make pImageInfo index non-null to avoid complaints of it missing
4694 VkDescriptorImageInfo imageInfo = {};
4695 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4696 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004698 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4699 m_errorMonitor->VerifyFound();
4700
Mark Muellerd4914412016-06-13 17:52:06 -06004701 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004702 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004703 vkDestroySampler(m_device->device(), sampler, NULL);
4704 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4705 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4706 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4707}
4708
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004709TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004710 TEST_DESCRIPTION(
4711 "Attempt to draw with a command buffer that is invalid "
4712 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004713 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004714
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004715 VkBuffer buffer;
4716 VkDeviceMemory mem;
4717 VkMemoryRequirements mem_reqs;
4718
4719 VkBufferCreateInfo buf_info = {};
4720 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004721 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004722 buf_info.size = 256;
4723 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4724 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4725 ASSERT_VK_SUCCESS(err);
4726
4727 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4728
4729 VkMemoryAllocateInfo alloc_info = {};
4730 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4731 alloc_info.allocationSize = 256;
4732 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004733 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004734 if (!pass) {
4735 vkDestroyBuffer(m_device->device(), buffer, NULL);
4736 return;
4737 }
4738 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4739 ASSERT_VK_SUCCESS(err);
4740
4741 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4742 ASSERT_VK_SUCCESS(err);
4743
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004744 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004745 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004746 m_commandBuffer->EndCommandBuffer();
4747
Mark Lobodzinski33826372017-04-13 11:10:11 -06004748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004749 // Destroy buffer dependency prior to submit to cause ERROR
4750 vkDestroyBuffer(m_device->device(), buffer, NULL);
4751
4752 VkSubmitInfo submit_info = {};
4753 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4754 submit_info.commandBufferCount = 1;
4755 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4756 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4757
4758 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004759 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004760 vkFreeMemory(m_device->handle(), mem, NULL);
4761}
4762
Tobin Ehlisea413442016-09-28 10:23:59 -06004763TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4764 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4765
Tony Barbour1fa09702017-03-16 12:09:08 -06004766 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004767 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4768
4769 VkDescriptorPoolSize ds_type_count;
4770 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4771 ds_type_count.descriptorCount = 1;
4772
4773 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4774 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4775 ds_pool_ci.maxSets = 1;
4776 ds_pool_ci.poolSizeCount = 1;
4777 ds_pool_ci.pPoolSizes = &ds_type_count;
4778
4779 VkDescriptorPool ds_pool;
4780 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4781 ASSERT_VK_SUCCESS(err);
4782
4783 VkDescriptorSetLayoutBinding layout_binding;
4784 layout_binding.binding = 0;
4785 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4786 layout_binding.descriptorCount = 1;
4787 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4788 layout_binding.pImmutableSamplers = NULL;
4789
4790 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4791 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4792 ds_layout_ci.bindingCount = 1;
4793 ds_layout_ci.pBindings = &layout_binding;
4794 VkDescriptorSetLayout ds_layout;
4795 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4796 ASSERT_VK_SUCCESS(err);
4797
4798 VkDescriptorSetAllocateInfo alloc_info = {};
4799 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4800 alloc_info.descriptorSetCount = 1;
4801 alloc_info.descriptorPool = ds_pool;
4802 alloc_info.pSetLayouts = &ds_layout;
4803 VkDescriptorSet descriptor_set;
4804 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4805 ASSERT_VK_SUCCESS(err);
4806
4807 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4808 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4809 pipeline_layout_ci.pNext = NULL;
4810 pipeline_layout_ci.setLayoutCount = 1;
4811 pipeline_layout_ci.pSetLayouts = &ds_layout;
4812
4813 VkPipelineLayout pipeline_layout;
4814 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4815 ASSERT_VK_SUCCESS(err);
4816
4817 VkBuffer buffer;
4818 uint32_t queue_family_index = 0;
4819 VkBufferCreateInfo buffer_create_info = {};
4820 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4821 buffer_create_info.size = 1024;
4822 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4823 buffer_create_info.queueFamilyIndexCount = 1;
4824 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4825
4826 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4827 ASSERT_VK_SUCCESS(err);
4828
4829 VkMemoryRequirements memory_reqs;
4830 VkDeviceMemory buffer_memory;
4831
4832 VkMemoryAllocateInfo memory_info = {};
4833 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4834 memory_info.allocationSize = 0;
4835 memory_info.memoryTypeIndex = 0;
4836
4837 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4838 memory_info.allocationSize = memory_reqs.size;
4839 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4840 ASSERT_TRUE(pass);
4841
4842 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4843 ASSERT_VK_SUCCESS(err);
4844 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4845 ASSERT_VK_SUCCESS(err);
4846
4847 VkBufferView view;
4848 VkBufferViewCreateInfo bvci = {};
4849 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4850 bvci.buffer = buffer;
4851 bvci.format = VK_FORMAT_R8_UNORM;
4852 bvci.range = VK_WHOLE_SIZE;
4853
4854 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4855 ASSERT_VK_SUCCESS(err);
4856
4857 VkWriteDescriptorSet descriptor_write = {};
4858 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4859 descriptor_write.dstSet = descriptor_set;
4860 descriptor_write.dstBinding = 0;
4861 descriptor_write.descriptorCount = 1;
4862 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4863 descriptor_write.pTexelBufferView = &view;
4864
4865 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4866
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004867 char const *vsSource =
4868 "#version 450\n"
4869 "\n"
4870 "out gl_PerVertex { \n"
4871 " vec4 gl_Position;\n"
4872 "};\n"
4873 "void main(){\n"
4874 " gl_Position = vec4(1);\n"
4875 "}\n";
4876 char const *fsSource =
4877 "#version 450\n"
4878 "\n"
4879 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4880 "layout(location=0) out vec4 x;\n"
4881 "void main(){\n"
4882 " x = imageLoad(s, 0);\n"
4883 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004884 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4885 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4886 VkPipelineObj pipe(m_device);
4887 pipe.AddShader(&vs);
4888 pipe.AddShader(&fs);
4889 pipe.AddColorAttachment();
4890 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4891
Mark Lobodzinski33826372017-04-13 11:10:11 -06004892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004893
Tony Barbour552f6c02016-12-21 14:34:07 -07004894 m_commandBuffer->BeginCommandBuffer();
4895 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4896
Tobin Ehlisea413442016-09-28 10:23:59 -06004897 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4898 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4899 VkRect2D scissor = {{0, 0}, {16, 16}};
4900 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4901 // Bind pipeline to cmd buffer
4902 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4903 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4904 &descriptor_set, 0, nullptr);
4905 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004906 m_commandBuffer->EndRenderPass();
4907 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004908
4909 // Delete BufferView in order to invalidate cmd buffer
4910 vkDestroyBufferView(m_device->device(), view, NULL);
4911 // Now attempt submit of cmd buffer
4912 VkSubmitInfo submit_info = {};
4913 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4914 submit_info.commandBufferCount = 1;
4915 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4916 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4917 m_errorMonitor->VerifyFound();
4918
4919 // Clean-up
4920 vkDestroyBuffer(m_device->device(), buffer, NULL);
4921 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4922 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4923 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4924 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4925}
4926
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004927TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004928 TEST_DESCRIPTION(
4929 "Attempt to draw with a command buffer that is invalid "
4930 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004931 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932
4933 VkImage image;
4934 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4935 VkImageCreateInfo image_create_info = {};
4936 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4937 image_create_info.pNext = NULL;
4938 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4939 image_create_info.format = tex_format;
4940 image_create_info.extent.width = 32;
4941 image_create_info.extent.height = 32;
4942 image_create_info.extent.depth = 1;
4943 image_create_info.mipLevels = 1;
4944 image_create_info.arrayLayers = 1;
4945 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4946 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004947 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004949 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004950 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004951 // Have to bind memory to image before recording cmd in cmd buffer using it
4952 VkMemoryRequirements mem_reqs;
4953 VkDeviceMemory image_mem;
4954 bool pass;
4955 VkMemoryAllocateInfo mem_alloc = {};
4956 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4957 mem_alloc.pNext = NULL;
4958 mem_alloc.memoryTypeIndex = 0;
4959 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4960 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004961 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004962 ASSERT_TRUE(pass);
4963 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4964 ASSERT_VK_SUCCESS(err);
4965 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4966 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004967
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004968 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004969 VkClearColorValue ccv;
4970 ccv.float32[0] = 1.0f;
4971 ccv.float32[1] = 1.0f;
4972 ccv.float32[2] = 1.0f;
4973 ccv.float32[3] = 1.0f;
4974 VkImageSubresourceRange isr = {};
4975 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004976 isr.baseArrayLayer = 0;
4977 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004978 isr.layerCount = 1;
4979 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004980 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004981 m_commandBuffer->EndCommandBuffer();
4982
Mark Lobodzinski33826372017-04-13 11:10:11 -06004983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004984 // Destroy image dependency prior to submit to cause ERROR
4985 vkDestroyImage(m_device->device(), image, NULL);
4986
4987 VkSubmitInfo submit_info = {};
4988 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4989 submit_info.commandBufferCount = 1;
4990 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4991 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4992
4993 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004994 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004995}
4996
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004997TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004998 TEST_DESCRIPTION(
4999 "Attempt to draw with a command buffer that is invalid "
5000 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005001 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005002 VkFormatProperties format_properties;
5003 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005004 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5005 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 return;
5007 }
5008
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005009 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5010
5011 VkImageCreateInfo image_ci = {};
5012 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5013 image_ci.pNext = NULL;
5014 image_ci.imageType = VK_IMAGE_TYPE_2D;
5015 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5016 image_ci.extent.width = 32;
5017 image_ci.extent.height = 32;
5018 image_ci.extent.depth = 1;
5019 image_ci.mipLevels = 1;
5020 image_ci.arrayLayers = 1;
5021 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5022 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005023 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005024 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5025 image_ci.flags = 0;
5026 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005027 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005028
5029 VkMemoryRequirements memory_reqs;
5030 VkDeviceMemory image_memory;
5031 bool pass;
5032 VkMemoryAllocateInfo memory_info = {};
5033 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5034 memory_info.pNext = NULL;
5035 memory_info.allocationSize = 0;
5036 memory_info.memoryTypeIndex = 0;
5037 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5038 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005039 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005040 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005041 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 ASSERT_VK_SUCCESS(err);
5043 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5044 ASSERT_VK_SUCCESS(err);
5045
5046 VkImageViewCreateInfo ivci = {
5047 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5048 nullptr,
5049 0,
5050 image,
5051 VK_IMAGE_VIEW_TYPE_2D,
5052 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005053 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005054 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5055 };
5056 VkImageView view;
5057 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5058 ASSERT_VK_SUCCESS(err);
5059
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005060 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005061 VkFramebuffer fb;
5062 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5063 ASSERT_VK_SUCCESS(err);
5064
5065 // Just use default renderpass with our framebuffer
5066 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005067 m_renderPassBeginInfo.renderArea.extent.width = 32;
5068 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005069 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005070 m_commandBuffer->BeginCommandBuffer();
5071 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5072 m_commandBuffer->EndRenderPass();
5073 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005074 // Destroy image attached to framebuffer to invalidate cmd buffer
5075 vkDestroyImage(m_device->device(), image, NULL);
5076 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005078 QueueCommandBuffer(false);
5079 m_errorMonitor->VerifyFound();
5080
5081 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5082 vkDestroyImageView(m_device->device(), view, nullptr);
5083 vkFreeMemory(m_device->device(), image_memory, nullptr);
5084}
5085
Tobin Ehlisb329f992016-10-12 13:20:29 -06005086TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5087 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005088 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005089 VkFormatProperties format_properties;
5090 VkResult err = VK_SUCCESS;
5091 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5092
Tobin Ehlisb329f992016-10-12 13:20:29 -06005093 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5094
5095 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005096 image.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005097 ASSERT_TRUE(image.initialized());
5098 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5099
5100 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5101 VkFramebuffer fb;
5102 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5103 ASSERT_VK_SUCCESS(err);
5104
5105 // Just use default renderpass with our framebuffer
5106 m_renderPassBeginInfo.framebuffer = fb;
5107 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005108 m_commandBuffer->BeginCommandBuffer();
5109 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5110 m_commandBuffer->EndRenderPass();
5111 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005112 // Submit cmd buffer to put it in-flight
5113 VkSubmitInfo submit_info = {};
5114 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5115 submit_info.commandBufferCount = 1;
5116 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5117 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5118 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005120 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5121 m_errorMonitor->VerifyFound();
5122 // Wait for queue to complete so we can safely destroy everything
5123 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005124 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5125 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005126 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5127}
5128
Tobin Ehlis88becd72016-09-21 14:33:41 -06005129TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5130 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005131 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005132 VkFormatProperties format_properties;
5133 VkResult err = VK_SUCCESS;
5134 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005135
Tobin Ehlis88becd72016-09-21 14:33:41 -06005136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5137
5138 VkImageCreateInfo image_ci = {};
5139 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5140 image_ci.pNext = NULL;
5141 image_ci.imageType = VK_IMAGE_TYPE_2D;
5142 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5143 image_ci.extent.width = 256;
5144 image_ci.extent.height = 256;
5145 image_ci.extent.depth = 1;
5146 image_ci.mipLevels = 1;
5147 image_ci.arrayLayers = 1;
5148 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5149 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005150 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005151 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5152 image_ci.flags = 0;
5153 VkImage image;
5154 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5155
5156 VkMemoryRequirements memory_reqs;
5157 VkDeviceMemory image_memory;
5158 bool pass;
5159 VkMemoryAllocateInfo memory_info = {};
5160 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5161 memory_info.pNext = NULL;
5162 memory_info.allocationSize = 0;
5163 memory_info.memoryTypeIndex = 0;
5164 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5165 memory_info.allocationSize = memory_reqs.size;
5166 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5167 ASSERT_TRUE(pass);
5168 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5169 ASSERT_VK_SUCCESS(err);
5170 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5171 ASSERT_VK_SUCCESS(err);
5172
5173 VkImageViewCreateInfo ivci = {
5174 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5175 nullptr,
5176 0,
5177 image,
5178 VK_IMAGE_VIEW_TYPE_2D,
5179 VK_FORMAT_B8G8R8A8_UNORM,
5180 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5181 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5182 };
5183 VkImageView view;
5184 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5185 ASSERT_VK_SUCCESS(err);
5186
5187 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5188 VkFramebuffer fb;
5189 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5190 ASSERT_VK_SUCCESS(err);
5191
5192 // Just use default renderpass with our framebuffer
5193 m_renderPassBeginInfo.framebuffer = fb;
5194 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005195 m_commandBuffer->BeginCommandBuffer();
5196 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5197 m_commandBuffer->EndRenderPass();
5198 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005199 // Submit cmd buffer to put it (and attached imageView) in-flight
5200 VkSubmitInfo submit_info = {};
5201 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5202 submit_info.commandBufferCount = 1;
5203 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5204 // Submit cmd buffer to put framebuffer and children in-flight
5205 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5206 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005208 vkDestroyImage(m_device->device(), image, NULL);
5209 m_errorMonitor->VerifyFound();
5210 // Wait for queue to complete so we can safely destroy image and other objects
5211 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005212 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5213 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005214 vkDestroyImage(m_device->device(), image, NULL);
5215 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5216 vkDestroyImageView(m_device->device(), view, nullptr);
5217 vkFreeMemory(m_device->device(), image_memory, nullptr);
5218}
5219
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005220TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5221 TEST_DESCRIPTION("Delete in-use renderPass.");
5222
Tony Barbour1fa09702017-03-16 12:09:08 -06005223 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5225
5226 // Create simple renderpass
5227 VkAttachmentReference attach = {};
5228 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5229 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005230 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005231 subpass.pColorAttachments = &attach;
5232 VkRenderPassCreateInfo rpci = {};
5233 rpci.subpassCount = 1;
5234 rpci.pSubpasses = &subpass;
5235 rpci.attachmentCount = 1;
5236 VkAttachmentDescription attach_desc = {};
5237 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5238 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5239 rpci.pAttachments = &attach_desc;
5240 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5241 VkRenderPass rp;
5242 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5243 ASSERT_VK_SUCCESS(err);
5244
5245 // Create a pipeline that uses the given renderpass
5246 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5247 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5248
5249 VkPipelineLayout pipeline_layout;
5250 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5251 ASSERT_VK_SUCCESS(err);
5252
5253 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5254 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5255 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005256 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005257 vp_state_ci.pViewports = &vp;
5258 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005259 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005260 vp_state_ci.pScissors = &scissors;
5261
5262 VkPipelineShaderStageCreateInfo shaderStages[2];
5263 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5264
5265 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005266 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005267 // but add it to be able to run on more devices
5268 shaderStages[0] = vs.GetStageCreateInfo();
5269 shaderStages[1] = fs.GetStageCreateInfo();
5270
5271 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5272 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5273
5274 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5275 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5276 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5277
5278 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5279 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5280 rs_ci.rasterizerDiscardEnable = true;
5281 rs_ci.lineWidth = 1.0f;
5282
5283 VkPipelineColorBlendAttachmentState att = {};
5284 att.blendEnable = VK_FALSE;
5285 att.colorWriteMask = 0xf;
5286
5287 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5288 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5289 cb_ci.attachmentCount = 1;
5290 cb_ci.pAttachments = &att;
5291
5292 VkGraphicsPipelineCreateInfo gp_ci = {};
5293 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5294 gp_ci.stageCount = 2;
5295 gp_ci.pStages = shaderStages;
5296 gp_ci.pVertexInputState = &vi_ci;
5297 gp_ci.pInputAssemblyState = &ia_ci;
5298 gp_ci.pViewportState = &vp_state_ci;
5299 gp_ci.pRasterizationState = &rs_ci;
5300 gp_ci.pColorBlendState = &cb_ci;
5301 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5302 gp_ci.layout = pipeline_layout;
5303 gp_ci.renderPass = rp;
5304
5305 VkPipelineCacheCreateInfo pc_ci = {};
5306 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5307
Dave Houlton756e6742017-03-23 14:33:22 -06005308 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005309 VkPipeline pipeline;
5310 VkPipelineCache pipe_cache;
5311 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5312 ASSERT_VK_SUCCESS(err);
5313
5314 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5315 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005316
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005317 // Bind pipeline to cmd buffer, will also bind renderpass
5318 m_commandBuffer->BeginCommandBuffer();
5319 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5320 m_commandBuffer->EndCommandBuffer();
5321
5322 VkSubmitInfo submit_info = {};
5323 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5324 submit_info.commandBufferCount = 1;
5325 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5326 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005327 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005328
5329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5330 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5331 m_errorMonitor->VerifyFound();
5332
5333 // Wait for queue to complete so we can safely destroy everything
5334 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005335 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005336 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005337 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5338 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5339 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5340 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5341}
5342
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005343TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005344 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005345 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005346
5347 VkImage image;
5348 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5349 VkImageCreateInfo image_create_info = {};
5350 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5351 image_create_info.pNext = NULL;
5352 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5353 image_create_info.format = tex_format;
5354 image_create_info.extent.width = 32;
5355 image_create_info.extent.height = 32;
5356 image_create_info.extent.depth = 1;
5357 image_create_info.mipLevels = 1;
5358 image_create_info.arrayLayers = 1;
5359 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5360 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005361 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005362 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005363 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005364 ASSERT_VK_SUCCESS(err);
5365 // Have to bind memory to image before recording cmd in cmd buffer using it
5366 VkMemoryRequirements mem_reqs;
5367 VkDeviceMemory image_mem;
5368 bool pass;
5369 VkMemoryAllocateInfo mem_alloc = {};
5370 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5371 mem_alloc.pNext = NULL;
5372 mem_alloc.memoryTypeIndex = 0;
5373 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5374 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005375 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005376 ASSERT_TRUE(pass);
5377 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5378 ASSERT_VK_SUCCESS(err);
5379
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005380 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005382 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005383
5384 m_commandBuffer->BeginCommandBuffer();
5385 VkClearColorValue ccv;
5386 ccv.float32[0] = 1.0f;
5387 ccv.float32[1] = 1.0f;
5388 ccv.float32[2] = 1.0f;
5389 ccv.float32[3] = 1.0f;
5390 VkImageSubresourceRange isr = {};
5391 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5392 isr.baseArrayLayer = 0;
5393 isr.baseMipLevel = 0;
5394 isr.layerCount = 1;
5395 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005396 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005397 m_commandBuffer->EndCommandBuffer();
5398
5399 m_errorMonitor->VerifyFound();
5400 vkDestroyImage(m_device->device(), image, NULL);
5401 vkFreeMemory(m_device->device(), image_mem, nullptr);
5402}
5403
5404TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005405 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005406 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005407
5408 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005409 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005410 VK_IMAGE_TILING_OPTIMAL, 0);
5411 ASSERT_TRUE(image.initialized());
5412
5413 VkBuffer buffer;
5414 VkDeviceMemory mem;
5415 VkMemoryRequirements mem_reqs;
5416
5417 VkBufferCreateInfo buf_info = {};
5418 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005419 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005420 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005421 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5422 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5423 ASSERT_VK_SUCCESS(err);
5424
5425 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5426
5427 VkMemoryAllocateInfo alloc_info = {};
5428 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005429 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005430 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005431 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005432 if (!pass) {
5433 vkDestroyBuffer(m_device->device(), buffer, NULL);
5434 return;
5435 }
5436 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5437 ASSERT_VK_SUCCESS(err);
5438
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005439 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005441 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005442 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005443 region.bufferRowLength = 16;
5444 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005445 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5446
5447 region.imageSubresource.layerCount = 1;
5448 region.imageExtent.height = 4;
5449 region.imageExtent.width = 4;
5450 region.imageExtent.depth = 1;
5451 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005452 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5453 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005454 m_commandBuffer->EndCommandBuffer();
5455
5456 m_errorMonitor->VerifyFound();
5457
5458 vkDestroyBuffer(m_device->device(), buffer, NULL);
5459 vkFreeMemory(m_device->handle(), mem, NULL);
5460}
5461
Tobin Ehlis85940f52016-07-07 16:57:21 -06005462TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005463 TEST_DESCRIPTION(
5464 "Attempt to draw with a command buffer that is invalid "
5465 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005466 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005467
5468 VkEvent event;
5469 VkEventCreateInfo evci = {};
5470 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5471 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5472 ASSERT_VK_SUCCESS(result);
5473
5474 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005475 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005476 m_commandBuffer->EndCommandBuffer();
5477
Mark Lobodzinski33826372017-04-13 11:10:11 -06005478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005479 // Destroy event dependency prior to submit to cause ERROR
5480 vkDestroyEvent(m_device->device(), event, NULL);
5481
5482 VkSubmitInfo submit_info = {};
5483 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5484 submit_info.commandBufferCount = 1;
5485 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5486 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5487
5488 m_errorMonitor->VerifyFound();
5489}
5490
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005491TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005492 TEST_DESCRIPTION(
5493 "Attempt to draw with a command buffer that is invalid "
5494 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005495 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005496
5497 VkQueryPool query_pool;
5498 VkQueryPoolCreateInfo qpci{};
5499 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5500 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5501 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005502 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005503 ASSERT_VK_SUCCESS(result);
5504
5505 m_commandBuffer->BeginCommandBuffer();
5506 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5507 m_commandBuffer->EndCommandBuffer();
5508
Mark Lobodzinski33826372017-04-13 11:10:11 -06005509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005510 // Destroy query pool dependency prior to submit to cause ERROR
5511 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5512
5513 VkSubmitInfo submit_info = {};
5514 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5515 submit_info.commandBufferCount = 1;
5516 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5517 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5518
5519 m_errorMonitor->VerifyFound();
5520}
5521
Tobin Ehlis24130d92016-07-08 15:50:53 -06005522TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005523 TEST_DESCRIPTION(
5524 "Attempt to draw with a command buffer that is invalid "
5525 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005526 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005527 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5528
5529 VkResult err;
5530
5531 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5532 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5533
5534 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005535 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005536 ASSERT_VK_SUCCESS(err);
5537
5538 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5539 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5540 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005541 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005542 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005543 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005544 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005545 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005546
5547 VkPipelineShaderStageCreateInfo shaderStages[2];
5548 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5549
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005550 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005551 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005552 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005553 shaderStages[0] = vs.GetStageCreateInfo();
5554 shaderStages[1] = fs.GetStageCreateInfo();
5555
5556 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5557 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5558
5559 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5560 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5561 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5562
5563 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5564 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005565 rs_ci.rasterizerDiscardEnable = true;
5566 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567
5568 VkPipelineColorBlendAttachmentState att = {};
5569 att.blendEnable = VK_FALSE;
5570 att.colorWriteMask = 0xf;
5571
5572 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5573 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5574 cb_ci.attachmentCount = 1;
5575 cb_ci.pAttachments = &att;
5576
5577 VkGraphicsPipelineCreateInfo gp_ci = {};
5578 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5579 gp_ci.stageCount = 2;
5580 gp_ci.pStages = shaderStages;
5581 gp_ci.pVertexInputState = &vi_ci;
5582 gp_ci.pInputAssemblyState = &ia_ci;
5583 gp_ci.pViewportState = &vp_state_ci;
5584 gp_ci.pRasterizationState = &rs_ci;
5585 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005586 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5587 gp_ci.layout = pipeline_layout;
5588 gp_ci.renderPass = renderPass();
5589
5590 VkPipelineCacheCreateInfo pc_ci = {};
5591 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5592
5593 VkPipeline pipeline;
5594 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005595 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005596 ASSERT_VK_SUCCESS(err);
5597
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005598 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005599 ASSERT_VK_SUCCESS(err);
5600
5601 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005602 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005603 m_commandBuffer->EndCommandBuffer();
5604 // Now destroy pipeline in order to cause error when submitting
5605 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5606
Mark Lobodzinski33826372017-04-13 11:10:11 -06005607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005608
5609 VkSubmitInfo submit_info = {};
5610 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5611 submit_info.commandBufferCount = 1;
5612 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5613 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5614
5615 m_errorMonitor->VerifyFound();
5616 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5617 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5618}
5619
Tobin Ehlis31289162016-08-17 14:57:58 -06005620TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005621 TEST_DESCRIPTION(
5622 "Attempt to draw with a command buffer that is invalid "
5623 "due to a bound descriptor set with a buffer dependency "
5624 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005625 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005626 ASSERT_NO_FATAL_FAILURE(InitViewport());
5627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5628
5629 VkDescriptorPoolSize ds_type_count = {};
5630 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5631 ds_type_count.descriptorCount = 1;
5632
5633 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5634 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5635 ds_pool_ci.pNext = NULL;
5636 ds_pool_ci.maxSets = 1;
5637 ds_pool_ci.poolSizeCount = 1;
5638 ds_pool_ci.pPoolSizes = &ds_type_count;
5639
5640 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005641 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005642 ASSERT_VK_SUCCESS(err);
5643
5644 VkDescriptorSetLayoutBinding dsl_binding = {};
5645 dsl_binding.binding = 0;
5646 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5647 dsl_binding.descriptorCount = 1;
5648 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5649 dsl_binding.pImmutableSamplers = NULL;
5650
5651 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5652 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5653 ds_layout_ci.pNext = NULL;
5654 ds_layout_ci.bindingCount = 1;
5655 ds_layout_ci.pBindings = &dsl_binding;
5656 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005657 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005658 ASSERT_VK_SUCCESS(err);
5659
5660 VkDescriptorSet descriptorSet;
5661 VkDescriptorSetAllocateInfo alloc_info = {};
5662 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5663 alloc_info.descriptorSetCount = 1;
5664 alloc_info.descriptorPool = ds_pool;
5665 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005666 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005667 ASSERT_VK_SUCCESS(err);
5668
5669 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5670 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5671 pipeline_layout_ci.pNext = NULL;
5672 pipeline_layout_ci.setLayoutCount = 1;
5673 pipeline_layout_ci.pSetLayouts = &ds_layout;
5674
5675 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005676 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005677 ASSERT_VK_SUCCESS(err);
5678
5679 // Create a buffer to update the descriptor with
5680 uint32_t qfi = 0;
5681 VkBufferCreateInfo buffCI = {};
5682 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5683 buffCI.size = 1024;
5684 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5685 buffCI.queueFamilyIndexCount = 1;
5686 buffCI.pQueueFamilyIndices = &qfi;
5687
5688 VkBuffer buffer;
5689 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5690 ASSERT_VK_SUCCESS(err);
5691 // Allocate memory and bind to buffer so we can make it to the appropriate
5692 // error
5693 VkMemoryAllocateInfo mem_alloc = {};
5694 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5695 mem_alloc.pNext = NULL;
5696 mem_alloc.allocationSize = 1024;
5697 mem_alloc.memoryTypeIndex = 0;
5698
5699 VkMemoryRequirements memReqs;
5700 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005701 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005702 if (!pass) {
5703 vkDestroyBuffer(m_device->device(), buffer, NULL);
5704 return;
5705 }
5706
5707 VkDeviceMemory mem;
5708 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5709 ASSERT_VK_SUCCESS(err);
5710 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5711 ASSERT_VK_SUCCESS(err);
5712 // Correctly update descriptor to avoid "NOT_UPDATED" error
5713 VkDescriptorBufferInfo buffInfo = {};
5714 buffInfo.buffer = buffer;
5715 buffInfo.offset = 0;
5716 buffInfo.range = 1024;
5717
5718 VkWriteDescriptorSet descriptor_write;
5719 memset(&descriptor_write, 0, sizeof(descriptor_write));
5720 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5721 descriptor_write.dstSet = descriptorSet;
5722 descriptor_write.dstBinding = 0;
5723 descriptor_write.descriptorCount = 1;
5724 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5725 descriptor_write.pBufferInfo = &buffInfo;
5726
5727 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5728
5729 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005730 char const *vsSource =
5731 "#version 450\n"
5732 "\n"
5733 "out gl_PerVertex { \n"
5734 " vec4 gl_Position;\n"
5735 "};\n"
5736 "void main(){\n"
5737 " gl_Position = vec4(1);\n"
5738 "}\n";
5739 char const *fsSource =
5740 "#version 450\n"
5741 "\n"
5742 "layout(location=0) out vec4 x;\n"
5743 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5744 "void main(){\n"
5745 " x = vec4(bar.y);\n"
5746 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005747 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5748 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5749 VkPipelineObj pipe(m_device);
5750 pipe.AddShader(&vs);
5751 pipe.AddShader(&fs);
5752 pipe.AddColorAttachment();
5753 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5754
Tony Barbour552f6c02016-12-21 14:34:07 -07005755 m_commandBuffer->BeginCommandBuffer();
5756 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005757 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5758 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5759 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005760
5761 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5762 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5763
Tobin Ehlis31289162016-08-17 14:57:58 -06005764 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005765 m_commandBuffer->EndRenderPass();
5766 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005768 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5769 vkDestroyBuffer(m_device->device(), buffer, NULL);
5770 // Attempt to submit cmd buffer
5771 VkSubmitInfo submit_info = {};
5772 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5773 submit_info.commandBufferCount = 1;
5774 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5775 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5776 m_errorMonitor->VerifyFound();
5777 // Cleanup
5778 vkFreeMemory(m_device->device(), mem, NULL);
5779
5780 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5781 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5782 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5783}
5784
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005785TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005786 TEST_DESCRIPTION(
5787 "Attempt to draw with a command buffer that is invalid "
5788 "due to a bound descriptor sets with a combined image "
5789 "sampler having their image, sampler, and descriptor set "
5790 "each respectively destroyed and then attempting to "
5791 "submit associated cmd buffers. Attempt to destroy a "
5792 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005793 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005794 ASSERT_NO_FATAL_FAILURE(InitViewport());
5795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5796
5797 VkDescriptorPoolSize ds_type_count = {};
5798 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5799 ds_type_count.descriptorCount = 1;
5800
5801 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5802 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5803 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005804 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005805 ds_pool_ci.maxSets = 1;
5806 ds_pool_ci.poolSizeCount = 1;
5807 ds_pool_ci.pPoolSizes = &ds_type_count;
5808
5809 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005810 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005811 ASSERT_VK_SUCCESS(err);
5812
5813 VkDescriptorSetLayoutBinding dsl_binding = {};
5814 dsl_binding.binding = 0;
5815 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5816 dsl_binding.descriptorCount = 1;
5817 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5818 dsl_binding.pImmutableSamplers = NULL;
5819
5820 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5821 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5822 ds_layout_ci.pNext = NULL;
5823 ds_layout_ci.bindingCount = 1;
5824 ds_layout_ci.pBindings = &dsl_binding;
5825 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005826 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005827 ASSERT_VK_SUCCESS(err);
5828
5829 VkDescriptorSet descriptorSet;
5830 VkDescriptorSetAllocateInfo alloc_info = {};
5831 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5832 alloc_info.descriptorSetCount = 1;
5833 alloc_info.descriptorPool = ds_pool;
5834 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005835 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005836 ASSERT_VK_SUCCESS(err);
5837
5838 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5839 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5840 pipeline_layout_ci.pNext = NULL;
5841 pipeline_layout_ci.setLayoutCount = 1;
5842 pipeline_layout_ci.pSetLayouts = &ds_layout;
5843
5844 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005845 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005846 ASSERT_VK_SUCCESS(err);
5847
5848 // Create images to update the descriptor with
5849 VkImage image;
5850 VkImage image2;
5851 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5852 const int32_t tex_width = 32;
5853 const int32_t tex_height = 32;
5854 VkImageCreateInfo image_create_info = {};
5855 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5856 image_create_info.pNext = NULL;
5857 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5858 image_create_info.format = tex_format;
5859 image_create_info.extent.width = tex_width;
5860 image_create_info.extent.height = tex_height;
5861 image_create_info.extent.depth = 1;
5862 image_create_info.mipLevels = 1;
5863 image_create_info.arrayLayers = 1;
5864 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5865 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5866 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5867 image_create_info.flags = 0;
5868 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5869 ASSERT_VK_SUCCESS(err);
5870 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5871 ASSERT_VK_SUCCESS(err);
5872
5873 VkMemoryRequirements memory_reqs;
5874 VkDeviceMemory image_memory;
5875 bool pass;
5876 VkMemoryAllocateInfo memory_info = {};
5877 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5878 memory_info.pNext = NULL;
5879 memory_info.allocationSize = 0;
5880 memory_info.memoryTypeIndex = 0;
5881 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5882 // Allocate enough memory for both images
5883 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005884 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005885 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005886 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005887 ASSERT_VK_SUCCESS(err);
5888 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5889 ASSERT_VK_SUCCESS(err);
5890 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005891 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005892 ASSERT_VK_SUCCESS(err);
5893
5894 VkImageViewCreateInfo image_view_create_info = {};
5895 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5896 image_view_create_info.image = image;
5897 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5898 image_view_create_info.format = tex_format;
5899 image_view_create_info.subresourceRange.layerCount = 1;
5900 image_view_create_info.subresourceRange.baseMipLevel = 0;
5901 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005902 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005903
5904 VkImageView view;
5905 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005906 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005907 ASSERT_VK_SUCCESS(err);
5908 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005909 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005910 ASSERT_VK_SUCCESS(err);
5911 // Create Samplers
5912 VkSamplerCreateInfo sampler_ci = {};
5913 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5914 sampler_ci.pNext = NULL;
5915 sampler_ci.magFilter = VK_FILTER_NEAREST;
5916 sampler_ci.minFilter = VK_FILTER_NEAREST;
5917 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5918 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5919 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5920 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5921 sampler_ci.mipLodBias = 1.0;
5922 sampler_ci.anisotropyEnable = VK_FALSE;
5923 sampler_ci.maxAnisotropy = 1;
5924 sampler_ci.compareEnable = VK_FALSE;
5925 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5926 sampler_ci.minLod = 1.0;
5927 sampler_ci.maxLod = 1.0;
5928 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5929 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5930 VkSampler sampler;
5931 VkSampler sampler2;
5932 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5933 ASSERT_VK_SUCCESS(err);
5934 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5935 ASSERT_VK_SUCCESS(err);
5936 // Update descriptor with image and sampler
5937 VkDescriptorImageInfo img_info = {};
5938 img_info.sampler = sampler;
5939 img_info.imageView = view;
5940 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5941
5942 VkWriteDescriptorSet descriptor_write;
5943 memset(&descriptor_write, 0, sizeof(descriptor_write));
5944 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5945 descriptor_write.dstSet = descriptorSet;
5946 descriptor_write.dstBinding = 0;
5947 descriptor_write.descriptorCount = 1;
5948 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5949 descriptor_write.pImageInfo = &img_info;
5950
5951 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5952
5953 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005954 char const *vsSource =
5955 "#version 450\n"
5956 "\n"
5957 "out gl_PerVertex { \n"
5958 " vec4 gl_Position;\n"
5959 "};\n"
5960 "void main(){\n"
5961 " gl_Position = vec4(1);\n"
5962 "}\n";
5963 char const *fsSource =
5964 "#version 450\n"
5965 "\n"
5966 "layout(set=0, binding=0) uniform sampler2D s;\n"
5967 "layout(location=0) out vec4 x;\n"
5968 "void main(){\n"
5969 " x = texture(s, vec2(1));\n"
5970 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005971 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5972 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5973 VkPipelineObj pipe(m_device);
5974 pipe.AddShader(&vs);
5975 pipe.AddShader(&fs);
5976 pipe.AddColorAttachment();
5977 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5978
5979 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005981 m_commandBuffer->BeginCommandBuffer();
5982 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005983 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5984 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5985 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005986 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5987 VkRect2D scissor = {{0, 0}, {16, 16}};
5988 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5989 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005990 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005991 m_commandBuffer->EndRenderPass();
5992 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005993 // Destroy sampler invalidates the cmd buffer, causing error on submit
5994 vkDestroySampler(m_device->device(), sampler, NULL);
5995 // Attempt to submit cmd buffer
5996 VkSubmitInfo submit_info = {};
5997 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5998 submit_info.commandBufferCount = 1;
5999 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6000 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6001 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07006002
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006003 // Now re-update descriptor with valid sampler and delete image
6004 img_info.sampler = sampler2;
6005 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006006
6007 VkCommandBufferBeginInfo info = {};
6008 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6009 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
6010
Mark Lobodzinski33826372017-04-13 11:10:11 -06006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07006012 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006013 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006014 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6015 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6016 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006017 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6018 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006019 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006020 m_commandBuffer->EndRenderPass();
6021 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006022 // Destroy image invalidates the cmd buffer, causing error on submit
6023 vkDestroyImage(m_device->device(), image, NULL);
6024 // Attempt to submit cmd buffer
6025 submit_info = {};
6026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6027 submit_info.commandBufferCount = 1;
6028 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6030 m_errorMonitor->VerifyFound();
6031 // Now update descriptor to be valid, but then free descriptor
6032 img_info.imageView = view2;
6033 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006034 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006036 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6037 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6038 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006039 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6040 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006041 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006042 m_commandBuffer->EndRenderPass();
6043 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006044 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006045
6046 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006048 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006049 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006050
6051 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006052 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006053 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006054 m_errorMonitor->SetUnexpectedError(
6055 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6056 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006057 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006058 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6059
6060 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006061 submit_info = {};
6062 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6063 submit_info.commandBufferCount = 1;
6064 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006066 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6067 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006068
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006069 // Cleanup
6070 vkFreeMemory(m_device->device(), image_memory, NULL);
6071 vkDestroySampler(m_device->device(), sampler2, NULL);
6072 vkDestroyImage(m_device->device(), image2, NULL);
6073 vkDestroyImageView(m_device->device(), view, NULL);
6074 vkDestroyImageView(m_device->device(), view2, NULL);
6075 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6076 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6077 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6078}
6079
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006080TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6081 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6082 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6083 ASSERT_NO_FATAL_FAILURE(InitViewport());
6084 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6085
6086 VkDescriptorPoolSize ds_type_count = {};
6087 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6088 ds_type_count.descriptorCount = 1;
6089
6090 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6091 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6092 ds_pool_ci.pNext = NULL;
6093 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6094 ds_pool_ci.maxSets = 1;
6095 ds_pool_ci.poolSizeCount = 1;
6096 ds_pool_ci.pPoolSizes = &ds_type_count;
6097
6098 VkDescriptorPool ds_pool;
6099 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6100 ASSERT_VK_SUCCESS(err);
6101
6102 VkDescriptorSetLayoutBinding dsl_binding = {};
6103 dsl_binding.binding = 0;
6104 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6105 dsl_binding.descriptorCount = 1;
6106 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6107 dsl_binding.pImmutableSamplers = NULL;
6108
6109 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6110 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6111 ds_layout_ci.pNext = NULL;
6112 ds_layout_ci.bindingCount = 1;
6113 ds_layout_ci.pBindings = &dsl_binding;
6114 VkDescriptorSetLayout ds_layout;
6115 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6116 ASSERT_VK_SUCCESS(err);
6117
6118 VkDescriptorSet descriptorSet;
6119 VkDescriptorSetAllocateInfo alloc_info = {};
6120 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6121 alloc_info.descriptorSetCount = 1;
6122 alloc_info.descriptorPool = ds_pool;
6123 alloc_info.pSetLayouts = &ds_layout;
6124 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6125 ASSERT_VK_SUCCESS(err);
6126
6127 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6128 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6129 pipeline_layout_ci.pNext = NULL;
6130 pipeline_layout_ci.setLayoutCount = 1;
6131 pipeline_layout_ci.pSetLayouts = &ds_layout;
6132
6133 VkPipelineLayout pipeline_layout;
6134 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6135 ASSERT_VK_SUCCESS(err);
6136
6137 // Create images to update the descriptor with
6138 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6139 VkImageObj image(m_device);
6140 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6141 0);
6142 ASSERT_TRUE(image.initialized());
6143
6144 VkImageViewCreateInfo image_view_create_info = {};
6145 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6146 image_view_create_info.image = image.handle();
6147 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6148 image_view_create_info.format = format;
6149 image_view_create_info.subresourceRange.layerCount = 1;
6150 image_view_create_info.subresourceRange.baseMipLevel = 0;
6151 image_view_create_info.subresourceRange.levelCount = 1;
6152 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6153
6154 VkImageView view;
6155 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6156 ASSERT_VK_SUCCESS(err);
6157 // Create Sampler
6158 VkSamplerCreateInfo sampler_ci = {};
6159 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6160 sampler_ci.pNext = NULL;
6161 sampler_ci.magFilter = VK_FILTER_NEAREST;
6162 sampler_ci.minFilter = VK_FILTER_NEAREST;
6163 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6164 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6165 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6166 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6167 sampler_ci.mipLodBias = 1.0;
6168 sampler_ci.anisotropyEnable = VK_FALSE;
6169 sampler_ci.maxAnisotropy = 1;
6170 sampler_ci.compareEnable = VK_FALSE;
6171 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6172 sampler_ci.minLod = 1.0;
6173 sampler_ci.maxLod = 1.0;
6174 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6175 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6176 VkSampler sampler;
6177 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6178 ASSERT_VK_SUCCESS(err);
6179 // Update descriptor with image and sampler
6180 VkDescriptorImageInfo img_info = {};
6181 img_info.sampler = sampler;
6182 img_info.imageView = view;
6183 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6184 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6185
6186 VkWriteDescriptorSet descriptor_write;
6187 memset(&descriptor_write, 0, sizeof(descriptor_write));
6188 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6189 descriptor_write.dstSet = descriptorSet;
6190 descriptor_write.dstBinding = 0;
6191 descriptor_write.descriptorCount = 1;
6192 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6193 descriptor_write.pImageInfo = &img_info;
6194
6195 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6196
6197 // Create PSO to be used for draw-time errors below
6198 char const *vsSource =
6199 "#version 450\n"
6200 "\n"
6201 "out gl_PerVertex { \n"
6202 " vec4 gl_Position;\n"
6203 "};\n"
6204 "void main(){\n"
6205 " gl_Position = vec4(1);\n"
6206 "}\n";
6207 char const *fsSource =
6208 "#version 450\n"
6209 "\n"
6210 "layout(set=0, binding=0) uniform sampler2D s;\n"
6211 "layout(location=0) out vec4 x;\n"
6212 "void main(){\n"
6213 " x = texture(s, vec2(1));\n"
6214 "}\n";
6215 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6216 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6217 VkPipelineObj pipe(m_device);
6218 pipe.AddShader(&vs);
6219 pipe.AddShader(&fs);
6220 pipe.AddColorAttachment();
6221 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6222
6223 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6224 cmd_buf.BeginCommandBuffer();
6225 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
6226 // record layout different than actual descriptor layout of SHADER_RO
6227 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
6228 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6229 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6230 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6231 VkRect2D scissor = {{0, 0}, {16, 16}};
6232 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6233 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6234 // At draw time the update layout will mis-match the actual layout
6235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6236 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6237 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6238 m_errorMonitor->SetDesiredFailureMsg(
6239 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6240 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6241 cmd_buf.Draw(1, 0, 0, 0);
6242 m_errorMonitor->VerifyFound();
6243 cmd_buf.EndRenderPass();
6244 cmd_buf.EndCommandBuffer();
6245 // Submit cmd buffer
6246 VkSubmitInfo submit_info = {};
6247 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6248 submit_info.commandBufferCount = 1;
6249 submit_info.pCommandBuffers = &cmd_buf.handle();
6250 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6251 vkQueueWaitIdle(m_device->m_queue);
6252 // Cleanup
6253 vkDestroySampler(m_device->device(), sampler, NULL);
6254 vkDestroyImageView(m_device->device(), view, NULL);
6255 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6256 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6257 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6258}
6259
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006260TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6261 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006262 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006263 ASSERT_NO_FATAL_FAILURE(InitViewport());
6264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6265
6266 VkDescriptorPoolSize ds_type_count = {};
6267 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6268 ds_type_count.descriptorCount = 1;
6269
6270 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6271 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6272 ds_pool_ci.pNext = NULL;
6273 ds_pool_ci.maxSets = 1;
6274 ds_pool_ci.poolSizeCount = 1;
6275 ds_pool_ci.pPoolSizes = &ds_type_count;
6276
6277 VkDescriptorPool ds_pool;
6278 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6279 ASSERT_VK_SUCCESS(err);
6280
6281 VkDescriptorSetLayoutBinding dsl_binding = {};
6282 dsl_binding.binding = 0;
6283 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6284 dsl_binding.descriptorCount = 1;
6285 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6286 dsl_binding.pImmutableSamplers = NULL;
6287
6288 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6289 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6290 ds_layout_ci.pNext = NULL;
6291 ds_layout_ci.bindingCount = 1;
6292 ds_layout_ci.pBindings = &dsl_binding;
6293 VkDescriptorSetLayout ds_layout;
6294 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6295 ASSERT_VK_SUCCESS(err);
6296
6297 VkDescriptorSet descriptor_set;
6298 VkDescriptorSetAllocateInfo alloc_info = {};
6299 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6300 alloc_info.descriptorSetCount = 1;
6301 alloc_info.descriptorPool = ds_pool;
6302 alloc_info.pSetLayouts = &ds_layout;
6303 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6304 ASSERT_VK_SUCCESS(err);
6305
6306 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6307 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6308 pipeline_layout_ci.pNext = NULL;
6309 pipeline_layout_ci.setLayoutCount = 1;
6310 pipeline_layout_ci.pSetLayouts = &ds_layout;
6311
6312 VkPipelineLayout pipeline_layout;
6313 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6314 ASSERT_VK_SUCCESS(err);
6315
6316 // Create image to update the descriptor with
6317 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006318 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006319 ASSERT_TRUE(image.initialized());
6320
6321 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6322 // Create Sampler
6323 VkSamplerCreateInfo sampler_ci = {};
6324 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6325 sampler_ci.pNext = NULL;
6326 sampler_ci.magFilter = VK_FILTER_NEAREST;
6327 sampler_ci.minFilter = VK_FILTER_NEAREST;
6328 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6329 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6330 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6331 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6332 sampler_ci.mipLodBias = 1.0;
6333 sampler_ci.anisotropyEnable = VK_FALSE;
6334 sampler_ci.maxAnisotropy = 1;
6335 sampler_ci.compareEnable = VK_FALSE;
6336 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6337 sampler_ci.minLod = 1.0;
6338 sampler_ci.maxLod = 1.0;
6339 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6340 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6341 VkSampler sampler;
6342 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6343 ASSERT_VK_SUCCESS(err);
6344 // Update descriptor with image and sampler
6345 VkDescriptorImageInfo img_info = {};
6346 img_info.sampler = sampler;
6347 img_info.imageView = view;
6348 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6349
6350 VkWriteDescriptorSet descriptor_write;
6351 memset(&descriptor_write, 0, sizeof(descriptor_write));
6352 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6353 descriptor_write.dstSet = descriptor_set;
6354 descriptor_write.dstBinding = 0;
6355 descriptor_write.descriptorCount = 1;
6356 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6357 descriptor_write.pImageInfo = &img_info;
6358
6359 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6360
6361 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006362 char const *vsSource =
6363 "#version 450\n"
6364 "\n"
6365 "out gl_PerVertex { \n"
6366 " vec4 gl_Position;\n"
6367 "};\n"
6368 "void main(){\n"
6369 " gl_Position = vec4(1);\n"
6370 "}\n";
6371 char const *fsSource =
6372 "#version 450\n"
6373 "\n"
6374 "layout(set=0, binding=0) uniform sampler2D s;\n"
6375 "layout(location=0) out vec4 x;\n"
6376 "void main(){\n"
6377 " x = texture(s, vec2(1));\n"
6378 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006379 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6380 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6381 VkPipelineObj pipe(m_device);
6382 pipe.AddShader(&vs);
6383 pipe.AddShader(&fs);
6384 pipe.AddColorAttachment();
6385 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6386
Tony Barbour552f6c02016-12-21 14:34:07 -07006387 m_commandBuffer->BeginCommandBuffer();
6388 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006389 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6390 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6391 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006392
6393 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6394 VkRect2D scissor = {{0, 0}, {16, 16}};
6395 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6396 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6397
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006398 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006399 m_commandBuffer->EndRenderPass();
6400 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006401 // Submit cmd buffer to put pool in-flight
6402 VkSubmitInfo submit_info = {};
6403 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6404 submit_info.commandBufferCount = 1;
6405 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6406 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6407 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006409 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6410 m_errorMonitor->VerifyFound();
6411 vkQueueWaitIdle(m_device->m_queue);
6412 // Cleanup
6413 vkDestroySampler(m_device->device(), sampler, NULL);
6414 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6415 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006416 m_errorMonitor->SetUnexpectedError(
6417 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006418 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006420 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006421}
6422
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006423TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6424 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006425 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006426 ASSERT_NO_FATAL_FAILURE(InitViewport());
6427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6428
6429 VkDescriptorPoolSize ds_type_count = {};
6430 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6431 ds_type_count.descriptorCount = 1;
6432
6433 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6434 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6435 ds_pool_ci.pNext = NULL;
6436 ds_pool_ci.maxSets = 1;
6437 ds_pool_ci.poolSizeCount = 1;
6438 ds_pool_ci.pPoolSizes = &ds_type_count;
6439
6440 VkDescriptorPool ds_pool;
6441 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6442 ASSERT_VK_SUCCESS(err);
6443
6444 VkDescriptorSetLayoutBinding dsl_binding = {};
6445 dsl_binding.binding = 0;
6446 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6447 dsl_binding.descriptorCount = 1;
6448 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6449 dsl_binding.pImmutableSamplers = NULL;
6450
6451 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6452 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6453 ds_layout_ci.pNext = NULL;
6454 ds_layout_ci.bindingCount = 1;
6455 ds_layout_ci.pBindings = &dsl_binding;
6456 VkDescriptorSetLayout ds_layout;
6457 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6458 ASSERT_VK_SUCCESS(err);
6459
6460 VkDescriptorSet descriptorSet;
6461 VkDescriptorSetAllocateInfo alloc_info = {};
6462 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6463 alloc_info.descriptorSetCount = 1;
6464 alloc_info.descriptorPool = ds_pool;
6465 alloc_info.pSetLayouts = &ds_layout;
6466 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6467 ASSERT_VK_SUCCESS(err);
6468
6469 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6470 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6471 pipeline_layout_ci.pNext = NULL;
6472 pipeline_layout_ci.setLayoutCount = 1;
6473 pipeline_layout_ci.pSetLayouts = &ds_layout;
6474
6475 VkPipelineLayout pipeline_layout;
6476 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6477 ASSERT_VK_SUCCESS(err);
6478
6479 // Create images to update the descriptor with
6480 VkImage image;
6481 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6482 const int32_t tex_width = 32;
6483 const int32_t tex_height = 32;
6484 VkImageCreateInfo image_create_info = {};
6485 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6486 image_create_info.pNext = NULL;
6487 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6488 image_create_info.format = tex_format;
6489 image_create_info.extent.width = tex_width;
6490 image_create_info.extent.height = tex_height;
6491 image_create_info.extent.depth = 1;
6492 image_create_info.mipLevels = 1;
6493 image_create_info.arrayLayers = 1;
6494 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6495 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6496 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6497 image_create_info.flags = 0;
6498 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6499 ASSERT_VK_SUCCESS(err);
6500 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6501 VkMemoryRequirements memory_reqs;
6502 VkDeviceMemory image_memory;
6503 bool pass;
6504 VkMemoryAllocateInfo memory_info = {};
6505 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6506 memory_info.pNext = NULL;
6507 memory_info.allocationSize = 0;
6508 memory_info.memoryTypeIndex = 0;
6509 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6510 // Allocate enough memory for image
6511 memory_info.allocationSize = memory_reqs.size;
6512 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6513 ASSERT_TRUE(pass);
6514 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6515 ASSERT_VK_SUCCESS(err);
6516 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6517 ASSERT_VK_SUCCESS(err);
6518
6519 VkImageViewCreateInfo image_view_create_info = {};
6520 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6521 image_view_create_info.image = image;
6522 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6523 image_view_create_info.format = tex_format;
6524 image_view_create_info.subresourceRange.layerCount = 1;
6525 image_view_create_info.subresourceRange.baseMipLevel = 0;
6526 image_view_create_info.subresourceRange.levelCount = 1;
6527 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6528
6529 VkImageView view;
6530 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6531 ASSERT_VK_SUCCESS(err);
6532 // Create Samplers
6533 VkSamplerCreateInfo sampler_ci = {};
6534 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6535 sampler_ci.pNext = NULL;
6536 sampler_ci.magFilter = VK_FILTER_NEAREST;
6537 sampler_ci.minFilter = VK_FILTER_NEAREST;
6538 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6539 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6540 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6541 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6542 sampler_ci.mipLodBias = 1.0;
6543 sampler_ci.anisotropyEnable = VK_FALSE;
6544 sampler_ci.maxAnisotropy = 1;
6545 sampler_ci.compareEnable = VK_FALSE;
6546 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6547 sampler_ci.minLod = 1.0;
6548 sampler_ci.maxLod = 1.0;
6549 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6550 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6551 VkSampler sampler;
6552 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6553 ASSERT_VK_SUCCESS(err);
6554 // Update descriptor with image and sampler
6555 VkDescriptorImageInfo img_info = {};
6556 img_info.sampler = sampler;
6557 img_info.imageView = view;
6558 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6559
6560 VkWriteDescriptorSet descriptor_write;
6561 memset(&descriptor_write, 0, sizeof(descriptor_write));
6562 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6563 descriptor_write.dstSet = descriptorSet;
6564 descriptor_write.dstBinding = 0;
6565 descriptor_write.descriptorCount = 1;
6566 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6567 descriptor_write.pImageInfo = &img_info;
6568 // Break memory binding and attempt update
6569 vkFreeMemory(m_device->device(), image_memory, nullptr);
6570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006571 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6573 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6574 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6575 m_errorMonitor->VerifyFound();
6576 // Cleanup
6577 vkDestroyImage(m_device->device(), image, NULL);
6578 vkDestroySampler(m_device->device(), sampler, NULL);
6579 vkDestroyImageView(m_device->device(), view, NULL);
6580 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6581 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6582 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6583}
6584
Karl Schultz6addd812016-02-02 17:17:23 -07006585TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006586 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6587 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006588 // Create a valid cmd buffer
6589 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006590 uint64_t fake_pipeline_handle = 0xbaad6001;
6591 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006592 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6594
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006596 m_commandBuffer->BeginCommandBuffer();
6597 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006598 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006599 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006600
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006601 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006603 Draw(1, 0, 0, 0);
6604 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006605
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006606 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006608 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006609 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6610 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006611}
6612
Karl Schultz6addd812016-02-02 17:17:23 -07006613TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006614 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006615 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006616
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006618
Tony Barbour1fa09702017-03-16 12:09:08 -06006619 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006620 ASSERT_NO_FATAL_FAILURE(InitViewport());
6621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006622 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006623 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6624 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006625
6626 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6628 ds_pool_ci.pNext = NULL;
6629 ds_pool_ci.maxSets = 1;
6630 ds_pool_ci.poolSizeCount = 1;
6631 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006632
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006633 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006634 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006635 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006636
Tony Barboureb254902015-07-15 12:50:33 -06006637 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006638 dsl_binding.binding = 0;
6639 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6640 dsl_binding.descriptorCount = 1;
6641 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6642 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006643
Tony Barboureb254902015-07-15 12:50:33 -06006644 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006645 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6646 ds_layout_ci.pNext = NULL;
6647 ds_layout_ci.bindingCount = 1;
6648 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006649 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006650 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006651 ASSERT_VK_SUCCESS(err);
6652
6653 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006654 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006655 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006656 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006657 alloc_info.descriptorPool = ds_pool;
6658 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006659 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006660 ASSERT_VK_SUCCESS(err);
6661
Tony Barboureb254902015-07-15 12:50:33 -06006662 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006663 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6664 pipeline_layout_ci.pNext = NULL;
6665 pipeline_layout_ci.setLayoutCount = 1;
6666 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006667
6668 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006669 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006670 ASSERT_VK_SUCCESS(err);
6671
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006672 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006673 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006674 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006675 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006676
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006677 VkPipelineObj pipe(m_device);
6678 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006679 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006680 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006681 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006682
Tony Barbour552f6c02016-12-21 14:34:07 -07006683 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006684 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6685 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6686 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006687
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006688 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006689
Chia-I Wuf7458c52015-10-26 21:10:41 +08006690 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6691 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6692 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006693}
6694
Karl Schultz6addd812016-02-02 17:17:23 -07006695TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006696 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006697 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006698
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006700
Tony Barbour1fa09702017-03-16 12:09:08 -06006701 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006702 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006703 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6704 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006705
6706 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006707 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6708 ds_pool_ci.pNext = NULL;
6709 ds_pool_ci.maxSets = 1;
6710 ds_pool_ci.poolSizeCount = 1;
6711 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006712
6713 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006714 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006715 ASSERT_VK_SUCCESS(err);
6716
6717 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006718 dsl_binding.binding = 0;
6719 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6720 dsl_binding.descriptorCount = 1;
6721 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6722 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006723
6724 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006725 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6726 ds_layout_ci.pNext = NULL;
6727 ds_layout_ci.bindingCount = 1;
6728 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006729 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006731 ASSERT_VK_SUCCESS(err);
6732
6733 VkDescriptorSet descriptorSet;
6734 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006735 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006736 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006737 alloc_info.descriptorPool = ds_pool;
6738 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006739 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006740 ASSERT_VK_SUCCESS(err);
6741
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006742 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006743 VkWriteDescriptorSet descriptor_write;
6744 memset(&descriptor_write, 0, sizeof(descriptor_write));
6745 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6746 descriptor_write.dstSet = descriptorSet;
6747 descriptor_write.dstBinding = 0;
6748 descriptor_write.descriptorCount = 1;
6749 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6750 descriptor_write.pTexelBufferView = &view;
6751
6752 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6753
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006754 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006755
6756 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6757 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6758}
6759
Mark Youngd339ba32016-05-30 13:28:35 -06006760TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006761 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006762
6763 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006765 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006766
Tony Barbour1fa09702017-03-16 12:09:08 -06006767 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006768
6769 // Create a buffer with no bound memory and then attempt to create
6770 // a buffer view.
6771 VkBufferCreateInfo buff_ci = {};
6772 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006773 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006774 buff_ci.size = 256;
6775 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6776 VkBuffer buffer;
6777 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6778 ASSERT_VK_SUCCESS(err);
6779
6780 VkBufferViewCreateInfo buff_view_ci = {};
6781 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6782 buff_view_ci.buffer = buffer;
6783 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6784 buff_view_ci.range = VK_WHOLE_SIZE;
6785 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006786 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006787
6788 m_errorMonitor->VerifyFound();
6789 vkDestroyBuffer(m_device->device(), buffer, NULL);
6790 // If last error is success, it still created the view, so delete it.
6791 if (err == VK_SUCCESS) {
6792 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6793 }
6794}
6795
Karl Schultz6addd812016-02-02 17:17:23 -07006796TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6797 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6798 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006799 // 1. No dynamicOffset supplied
6800 // 2. Too many dynamicOffsets supplied
6801 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006802 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6804 " requires 1 dynamicOffsets, but only "
6805 "0 dynamicOffsets are left in "
6806 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006807
Tony Barbour1fa09702017-03-16 12:09:08 -06006808 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006809 ASSERT_NO_FATAL_FAILURE(InitViewport());
6810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6811
6812 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006813 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6814 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006815
6816 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006817 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6818 ds_pool_ci.pNext = NULL;
6819 ds_pool_ci.maxSets = 1;
6820 ds_pool_ci.poolSizeCount = 1;
6821 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006822
6823 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006824 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006825 ASSERT_VK_SUCCESS(err);
6826
6827 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006828 dsl_binding.binding = 0;
6829 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6830 dsl_binding.descriptorCount = 1;
6831 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6832 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006833
6834 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006835 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6836 ds_layout_ci.pNext = NULL;
6837 ds_layout_ci.bindingCount = 1;
6838 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006839 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006840 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006841 ASSERT_VK_SUCCESS(err);
6842
6843 VkDescriptorSet descriptorSet;
6844 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006845 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006846 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006847 alloc_info.descriptorPool = ds_pool;
6848 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006849 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006850 ASSERT_VK_SUCCESS(err);
6851
6852 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006853 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6854 pipeline_layout_ci.pNext = NULL;
6855 pipeline_layout_ci.setLayoutCount = 1;
6856 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006857
6858 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006859 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006860 ASSERT_VK_SUCCESS(err);
6861
6862 // Create a buffer to update the descriptor with
6863 uint32_t qfi = 0;
6864 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006865 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6866 buffCI.size = 1024;
6867 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6868 buffCI.queueFamilyIndexCount = 1;
6869 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006870
6871 VkBuffer dyub;
6872 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6873 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006874 // Allocate memory and bind to buffer so we can make it to the appropriate
6875 // error
6876 VkMemoryAllocateInfo mem_alloc = {};
6877 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6878 mem_alloc.pNext = NULL;
6879 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006880 mem_alloc.memoryTypeIndex = 0;
6881
6882 VkMemoryRequirements memReqs;
6883 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006884 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006885 if (!pass) {
6886 vkDestroyBuffer(m_device->device(), dyub, NULL);
6887 return;
6888 }
6889
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006890 VkDeviceMemory mem;
6891 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6892 ASSERT_VK_SUCCESS(err);
6893 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6894 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006895 // Correctly update descriptor to avoid "NOT_UPDATED" error
6896 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006897 buffInfo.buffer = dyub;
6898 buffInfo.offset = 0;
6899 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006900
6901 VkWriteDescriptorSet descriptor_write;
6902 memset(&descriptor_write, 0, sizeof(descriptor_write));
6903 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6904 descriptor_write.dstSet = descriptorSet;
6905 descriptor_write.dstBinding = 0;
6906 descriptor_write.descriptorCount = 1;
6907 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6908 descriptor_write.pBufferInfo = &buffInfo;
6909
6910 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6911
Tony Barbour552f6c02016-12-21 14:34:07 -07006912 m_commandBuffer->BeginCommandBuffer();
6913 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006914 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6915 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006916 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006917 uint32_t pDynOff[2] = {512, 756};
6918 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6920 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6921 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6922 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006923 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006924 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6926 " dynamic offset 512 combined with "
6927 "offset 0 and range 1024 that "
6928 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006929 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006930 char const *vsSource =
6931 "#version 450\n"
6932 "\n"
6933 "out gl_PerVertex { \n"
6934 " vec4 gl_Position;\n"
6935 "};\n"
6936 "void main(){\n"
6937 " gl_Position = vec4(1);\n"
6938 "}\n";
6939 char const *fsSource =
6940 "#version 450\n"
6941 "\n"
6942 "layout(location=0) out vec4 x;\n"
6943 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6944 "void main(){\n"
6945 " x = vec4(bar.y);\n"
6946 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006947 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6948 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6949 VkPipelineObj pipe(m_device);
6950 pipe.AddShader(&vs);
6951 pipe.AddShader(&fs);
6952 pipe.AddColorAttachment();
6953 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6954
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006955 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6956 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6957 VkRect2D scissor = {{0, 0}, {16, 16}};
6958 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6959
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006960 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006961 // This update should succeed, but offset size of 512 will overstep buffer
6962 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006963 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6964 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006965 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006966 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006967
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006968 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006969 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006970
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006971 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006972 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006973 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6974}
6975
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006976TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006977 TEST_DESCRIPTION(
6978 "Attempt to update a descriptor with a non-sparse buffer "
6979 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006980 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006982 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6984 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006985
Tony Barbour1fa09702017-03-16 12:09:08 -06006986 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006987 ASSERT_NO_FATAL_FAILURE(InitViewport());
6988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6989
6990 VkDescriptorPoolSize ds_type_count = {};
6991 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6992 ds_type_count.descriptorCount = 1;
6993
6994 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6995 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6996 ds_pool_ci.pNext = NULL;
6997 ds_pool_ci.maxSets = 1;
6998 ds_pool_ci.poolSizeCount = 1;
6999 ds_pool_ci.pPoolSizes = &ds_type_count;
7000
7001 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007002 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007003 ASSERT_VK_SUCCESS(err);
7004
7005 VkDescriptorSetLayoutBinding dsl_binding = {};
7006 dsl_binding.binding = 0;
7007 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7008 dsl_binding.descriptorCount = 1;
7009 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7010 dsl_binding.pImmutableSamplers = NULL;
7011
7012 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7013 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7014 ds_layout_ci.pNext = NULL;
7015 ds_layout_ci.bindingCount = 1;
7016 ds_layout_ci.pBindings = &dsl_binding;
7017 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007018 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007019 ASSERT_VK_SUCCESS(err);
7020
7021 VkDescriptorSet descriptorSet;
7022 VkDescriptorSetAllocateInfo alloc_info = {};
7023 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7024 alloc_info.descriptorSetCount = 1;
7025 alloc_info.descriptorPool = ds_pool;
7026 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007027 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007028 ASSERT_VK_SUCCESS(err);
7029
7030 // Create a buffer to update the descriptor with
7031 uint32_t qfi = 0;
7032 VkBufferCreateInfo buffCI = {};
7033 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7034 buffCI.size = 1024;
7035 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7036 buffCI.queueFamilyIndexCount = 1;
7037 buffCI.pQueueFamilyIndices = &qfi;
7038
7039 VkBuffer dyub;
7040 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7041 ASSERT_VK_SUCCESS(err);
7042
7043 // Attempt to update descriptor without binding memory to it
7044 VkDescriptorBufferInfo buffInfo = {};
7045 buffInfo.buffer = dyub;
7046 buffInfo.offset = 0;
7047 buffInfo.range = 1024;
7048
7049 VkWriteDescriptorSet descriptor_write;
7050 memset(&descriptor_write, 0, sizeof(descriptor_write));
7051 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7052 descriptor_write.dstSet = descriptorSet;
7053 descriptor_write.dstBinding = 0;
7054 descriptor_write.descriptorCount = 1;
7055 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7056 descriptor_write.pBufferInfo = &buffInfo;
7057
7058 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7059 m_errorMonitor->VerifyFound();
7060
7061 vkDestroyBuffer(m_device->device(), dyub, NULL);
7062 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7063 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7064}
7065
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007066TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007067 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007068 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007069 ASSERT_NO_FATAL_FAILURE(InitViewport());
7070 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7071
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007072 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007073 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007074 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7075 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7076 pipeline_layout_ci.pushConstantRangeCount = 1;
7077 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7078
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007079 //
7080 // Check for invalid push constant ranges in pipeline layouts.
7081 //
7082 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007083 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007084 char const *msg;
7085 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007086
Karl Schultzc81037d2016-05-12 08:11:23 -06007087 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7088 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7089 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7090 "vkCreatePipelineLayout() call has push constants index 0 with "
7091 "size 0."},
7092 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7093 "vkCreatePipelineLayout() call has push constants index 0 with "
7094 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007095 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007096 "vkCreatePipelineLayout() call has push constants index 0 with "
7097 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007098 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007099 "vkCreatePipelineLayout() call has push constants index 0 with "
7100 "size 0."},
7101 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7102 "vkCreatePipelineLayout() call has push constants index 0 with "
7103 "offset 1. Offset must"},
7104 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7105 "vkCreatePipelineLayout() call has push constants index 0 "
7106 "with offset "},
7107 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7108 "vkCreatePipelineLayout() call has push constants "
7109 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007110 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007111 "vkCreatePipelineLayout() call has push constants index 0 "
7112 "with offset "},
7113 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7114 "vkCreatePipelineLayout() call has push "
7115 "constants index 0 with offset "},
7116 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7117 "vkCreatePipelineLayout() call has push "
7118 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007119 }};
7120
7121 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007122 for (const auto &iter : range_tests) {
7123 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7125 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007126 m_errorMonitor->VerifyFound();
7127 if (VK_SUCCESS == err) {
7128 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7129 }
7130 }
7131
7132 // Check for invalid stage flag
7133 pc_range.offset = 0;
7134 pc_range.size = 16;
7135 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007136 m_errorMonitor->SetDesiredFailureMsg(
7137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7138 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007139 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007140 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007141 if (VK_SUCCESS == err) {
7142 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7143 }
7144
Karl Schultzc59b72d2017-02-24 15:45:05 -07007145 // Check for duplicate stage flags in a list of push constant ranges.
7146 // A shader can only have one push constant block and that block is mapped
7147 // to the push constant range that has that shader's stage flag set.
7148 // The shader's stage flag can only appear once in all the ranges, so the
7149 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007150 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007151 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007152 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007153 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007154 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007155 // Overlapping ranges are OK, but a stage flag can appear only once.
7156 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7157 {
7158 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7159 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7160 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7161 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007162 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007163 {
7164 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7165 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7166 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7167 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7168 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7169 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7170 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7171 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7172 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7173 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7174 }},
7175 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7176 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7177 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7178 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7179 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7180 {
7181 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7182 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7183 }},
7184 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7185 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7186 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7187 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7188 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7189 {
7190 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7191 }},
7192 },
7193 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007194
Karl Schultzc59b72d2017-02-24 15:45:05 -07007195 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007196 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007197 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007199 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007200 m_errorMonitor->VerifyFound();
7201 if (VK_SUCCESS == err) {
7202 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7203 }
7204 }
7205
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007206 //
7207 // CmdPushConstants tests
7208 //
7209
Karl Schultzc59b72d2017-02-24 15:45:05 -07007210 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007211 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007212 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007213 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007214 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007215 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007216 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007217 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007218
7219 const uint8_t dummy_values[100] = {};
7220
7221 m_commandBuffer->BeginCommandBuffer();
7222 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007223
7224 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007225 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007227 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007228 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007229
Karl Schultzc59b72d2017-02-24 15:45:05 -07007230 m_errorMonitor->ExpectSuccess();
7231 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7232 m_errorMonitor->VerifyNotFound();
7233 m_errorMonitor->ExpectSuccess();
7234 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7235 m_errorMonitor->VerifyNotFound();
7236 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7237 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7238 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7239 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7240 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7241 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7242 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007243 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007244 for (const auto &iter : cmd_range_tests) {
7245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7246 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7247 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007248 m_errorMonitor->VerifyFound();
7249 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007250
Tony Barbour552f6c02016-12-21 14:34:07 -07007251 m_commandBuffer->EndRenderPass();
7252 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007253 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007254}
7255
Karl Schultz6addd812016-02-02 17:17:23 -07007256TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007257 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007258 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007259
Tony Barbour1fa09702017-03-16 12:09:08 -06007260 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007261 ASSERT_NO_FATAL_FAILURE(InitViewport());
7262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7263
7264 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7265 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007266 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7267 ds_type_count[0].descriptorCount = 10;
7268 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7269 ds_type_count[1].descriptorCount = 2;
7270 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7271 ds_type_count[2].descriptorCount = 2;
7272 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7273 ds_type_count[3].descriptorCount = 5;
7274 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7275 // type
7276 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7277 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7278 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007279
7280 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007281 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7282 ds_pool_ci.pNext = NULL;
7283 ds_pool_ci.maxSets = 5;
7284 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7285 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007286
7287 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007288 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007289 ASSERT_VK_SUCCESS(err);
7290
7291 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7292 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007293 dsl_binding[0].binding = 0;
7294 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7295 dsl_binding[0].descriptorCount = 5;
7296 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7297 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007298
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007299 // Create layout identical to set0 layout but w/ different stageFlags
7300 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007301 dsl_fs_stage_only.binding = 0;
7302 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7303 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007304 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7305 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007306 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007307 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007308 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7309 ds_layout_ci.pNext = NULL;
7310 ds_layout_ci.bindingCount = 1;
7311 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007312 static const uint32_t NUM_LAYOUTS = 4;
7313 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007314 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007315 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7316 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007317 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007318 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007319 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007320 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007321 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007322 dsl_binding[0].binding = 0;
7323 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007324 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007325 dsl_binding[1].binding = 1;
7326 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7327 dsl_binding[1].descriptorCount = 2;
7328 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7329 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007330 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007331 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007332 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007333 ASSERT_VK_SUCCESS(err);
7334 dsl_binding[0].binding = 0;
7335 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007336 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007337 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007338 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007339 ASSERT_VK_SUCCESS(err);
7340 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007341 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007342 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007343 ASSERT_VK_SUCCESS(err);
7344
7345 static const uint32_t NUM_SETS = 4;
7346 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7347 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007348 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007349 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007350 alloc_info.descriptorPool = ds_pool;
7351 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007352 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007353 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007354 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007355 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007356 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007357 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007358 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007359
7360 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007361 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7362 pipeline_layout_ci.pNext = NULL;
7363 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7364 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007365
7366 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007367 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007368 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007369 // Create pipelineLayout with only one setLayout
7370 pipeline_layout_ci.setLayoutCount = 1;
7371 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007372 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007373 ASSERT_VK_SUCCESS(err);
7374 // Create pipelineLayout with 2 descriptor setLayout at index 0
7375 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7376 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007377 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007378 ASSERT_VK_SUCCESS(err);
7379 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7380 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7381 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007382 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007383 ASSERT_VK_SUCCESS(err);
7384 // Create pipelineLayout with UB type, but stageFlags for FS only
7385 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7386 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007387 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007388 ASSERT_VK_SUCCESS(err);
7389 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7390 VkDescriptorSetLayout pl_bad_s0[2] = {};
7391 pl_bad_s0[0] = ds_layout_fs_only;
7392 pl_bad_s0[1] = ds_layout[1];
7393 pipeline_layout_ci.setLayoutCount = 2;
7394 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7395 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007396 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007397 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007398
Tobin Ehlis88452832015-12-03 09:40:56 -07007399 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007400 char const *vsSource =
7401 "#version 450\n"
7402 "\n"
7403 "out gl_PerVertex {\n"
7404 " vec4 gl_Position;\n"
7405 "};\n"
7406 "void main(){\n"
7407 " gl_Position = vec4(1);\n"
7408 "}\n";
7409 char const *fsSource =
7410 "#version 450\n"
7411 "\n"
7412 "layout(location=0) out vec4 x;\n"
7413 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7414 "void main(){\n"
7415 " x = vec4(bar.y);\n"
7416 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007417 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7418 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007419 VkPipelineObj pipe(m_device);
7420 pipe.AddShader(&vs);
7421 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007422 pipe.AddColorAttachment();
7423 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007424
Tony Barbour552f6c02016-12-21 14:34:07 -07007425 m_commandBuffer->BeginCommandBuffer();
7426 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007427
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007428 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007429 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7430 // of PSO
7431 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7432 // cmd_pipeline.c
7433 // due to the fact that cmd_alloc_dset_data() has not been called in
7434 // cmd_bind_graphics_pipeline()
7435 // TODO : Want to cause various binding incompatibility issues here to test
7436 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007437 // First cause various verify_layout_compatibility() fails
7438 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007439 // verify_set_layout_compatibility fail cases:
7440 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007442 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7443 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007444 m_errorMonitor->VerifyFound();
7445
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007446 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7448 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7449 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007450 m_errorMonitor->VerifyFound();
7451
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007452 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007453 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7454 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7456 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7457 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007458 m_errorMonitor->VerifyFound();
7459
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007460 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7461 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7463 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7464 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007465 m_errorMonitor->VerifyFound();
7466
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007467 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7468 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7470 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7471 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7472 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007473 m_errorMonitor->VerifyFound();
7474
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007475 // Cause INFO messages due to disturbing previously bound Sets
7476 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007477 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7478 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007479 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7481 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7482 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007483 m_errorMonitor->VerifyFound();
7484
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007485 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7486 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007487 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7489 " newly bound as set #0 so set #1 and "
7490 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007491 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7492 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007493 m_errorMonitor->VerifyFound();
7494
Tobin Ehlis10fad692016-07-07 12:00:36 -06007495 // Now that we're done actively using the pipelineLayout that gfx pipeline
7496 // was created with, we should be able to delete it. Do that now to verify
7497 // that validation obeys pipelineLayout lifetime
7498 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7499
Tobin Ehlis88452832015-12-03 09:40:56 -07007500 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007501 // 1. Error due to not binding required set (we actually use same code as
7502 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007503 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7504 &descriptorSet[0], 0, NULL);
7505 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7506 &descriptorSet[1], 0, NULL);
7507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007508
7509 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7510 VkRect2D scissor = {{0, 0}, {16, 16}};
7511 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7512 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7513
Tobin Ehlis88452832015-12-03 09:40:56 -07007514 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007515 m_errorMonitor->VerifyFound();
7516
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007517 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007518 // 2. Error due to bound set not being compatible with PSO's
7519 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007520 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7521 &descriptorSet[0], 0, NULL);
7522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007523 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007524 m_errorMonitor->VerifyFound();
7525
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007526 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007527 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007528 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7529 }
7530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007531 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7532 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7533}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007534
Karl Schultz6addd812016-02-02 17:17:23 -07007535TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7537 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007538
Tony Barbour1fa09702017-03-16 12:09:08 -06007539 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007540 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007541 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007542 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007543
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007544 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007545}
7546
Karl Schultz6addd812016-02-02 17:17:23 -07007547TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7548 VkResult err;
7549 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007550
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007552
Tony Barbour1fa09702017-03-16 12:09:08 -06007553 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007554
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007555 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007556 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007557 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007558 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007559 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007560 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007561
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007562 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007563 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007564
7565 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007566 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007567 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7568
7569 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007570 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007571 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007572 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007573 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007574
7575 // The error should be caught by validation of the BeginCommandBuffer call
7576 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7577
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007578 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007579 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007580}
7581
Karl Schultz6addd812016-02-02 17:17:23 -07007582TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007583 // Cause error due to Begin while recording CB
7584 // Then cause 2 errors for attempting to reset CB w/o having
7585 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7586 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007588
Tony Barbour1fa09702017-03-16 12:09:08 -06007589 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007590
7591 // Calls AllocateCommandBuffers
7592 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7593
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007594 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007595 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007596 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7597 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007598 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7599 cmd_buf_info.pNext = NULL;
7600 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007601 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007602
7603 // Begin CB to transition to recording state
7604 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7605 // Can't re-begin. This should trigger error
7606 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007607 m_errorMonitor->VerifyFound();
7608
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007610 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007611 // Reset attempt will trigger error due to incorrect CommandPool state
7612 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007613 m_errorMonitor->VerifyFound();
7614
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007616 // Transition CB to RECORDED state
7617 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7618 // Now attempting to Begin will implicitly reset, which triggers error
7619 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007620 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007621}
7622
Karl Schultz6addd812016-02-02 17:17:23 -07007623TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007624 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007625 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007626
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7628 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007629
Tony Barbour1fa09702017-03-16 12:09:08 -06007630 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007631 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007632
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007633 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007634 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7635 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007636
7637 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007638 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7639 ds_pool_ci.pNext = NULL;
7640 ds_pool_ci.maxSets = 1;
7641 ds_pool_ci.poolSizeCount = 1;
7642 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007643
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007644 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007645 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007646 ASSERT_VK_SUCCESS(err);
7647
Tony Barboureb254902015-07-15 12:50:33 -06007648 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007649 dsl_binding.binding = 0;
7650 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7651 dsl_binding.descriptorCount = 1;
7652 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7653 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007654
Tony Barboureb254902015-07-15 12:50:33 -06007655 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007656 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7657 ds_layout_ci.pNext = NULL;
7658 ds_layout_ci.bindingCount = 1;
7659 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007660
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007661 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007662 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007663 ASSERT_VK_SUCCESS(err);
7664
7665 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007666 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007667 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007668 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007669 alloc_info.descriptorPool = ds_pool;
7670 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007671 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007672 ASSERT_VK_SUCCESS(err);
7673
Tony Barboureb254902015-07-15 12:50:33 -06007674 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007675 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7676 pipeline_layout_ci.setLayoutCount = 1;
7677 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007678
7679 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007680 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007681 ASSERT_VK_SUCCESS(err);
7682
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007683 VkViewport vp = {}; // Just need dummy vp to point to
7684 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007685
7686 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007687 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7688 vp_state_ci.scissorCount = 1;
7689 vp_state_ci.pScissors = &sc;
7690 vp_state_ci.viewportCount = 1;
7691 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007692
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007693 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7694 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7695 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7696 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7697 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7698 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007699 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007700 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007701 rs_state_ci.lineWidth = 1.0f;
7702
7703 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7704 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7705 vi_ci.pNext = nullptr;
7706 vi_ci.vertexBindingDescriptionCount = 0;
7707 vi_ci.pVertexBindingDescriptions = nullptr;
7708 vi_ci.vertexAttributeDescriptionCount = 0;
7709 vi_ci.pVertexAttributeDescriptions = nullptr;
7710
7711 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7712 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7713 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7714
7715 VkPipelineShaderStageCreateInfo shaderStages[2];
7716 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7717
7718 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7719 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007720 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007721 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007722
Tony Barboureb254902015-07-15 12:50:33 -06007723 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007724 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7725 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007726 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007727 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7728 gp_ci.layout = pipeline_layout;
7729 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007730 gp_ci.pVertexInputState = &vi_ci;
7731 gp_ci.pInputAssemblyState = &ia_ci;
7732
7733 gp_ci.stageCount = 1;
7734 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007735
7736 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007737 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7738 pc_ci.initialDataSize = 0;
7739 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007740
7741 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007742 VkPipelineCache pipelineCache;
7743
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007744 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007745 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007746 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007747 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007748
Chia-I Wuf7458c52015-10-26 21:10:41 +08007749 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7750 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7751 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7752 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007753}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007754
Tobin Ehlis912df022015-09-17 08:46:18 -06007755/*// TODO : This test should be good, but needs Tess support in compiler to run
7756TEST_F(VkLayerTest, InvalidPatchControlPoints)
7757{
7758 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007759 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007760
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007762 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7763primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007764
Tony Barbour1fa09702017-03-16 12:09:08 -06007765 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007766 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007767
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007768 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007769 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007770 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007771
7772 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7773 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7774 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007775 ds_pool_ci.poolSizeCount = 1;
7776 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007777
7778 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007779 err = vkCreateDescriptorPool(m_device->device(),
7780VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007781 ASSERT_VK_SUCCESS(err);
7782
7783 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007784 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007785 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007786 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007787 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7788 dsl_binding.pImmutableSamplers = NULL;
7789
7790 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007791 ds_layout_ci.sType =
7792VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007793 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007794 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007795 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007796
7797 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7799&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007800 ASSERT_VK_SUCCESS(err);
7801
7802 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007803 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7804VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007805 ASSERT_VK_SUCCESS(err);
7806
7807 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007808 pipeline_layout_ci.sType =
7809VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007810 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007811 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007812 pipeline_layout_ci.pSetLayouts = &ds_layout;
7813
7814 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007815 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7816&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007817 ASSERT_VK_SUCCESS(err);
7818
7819 VkPipelineShaderStageCreateInfo shaderStages[3];
7820 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7821
Karl Schultz6addd812016-02-02 17:17:23 -07007822 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7823this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007824 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007825 VkShaderObj
7826tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7827this);
7828 VkShaderObj
7829te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7830this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007831
Karl Schultz6addd812016-02-02 17:17:23 -07007832 shaderStages[0].sType =
7833VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007834 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007835 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007836 shaderStages[1].sType =
7837VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007838 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007839 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007840 shaderStages[2].sType =
7841VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007842 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007843 shaderStages[2].shader = te.handle();
7844
7845 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007846 iaCI.sType =
7847VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007848 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007849
7850 VkPipelineTessellationStateCreateInfo tsCI = {};
7851 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7852 tsCI.patchControlPoints = 0; // This will cause an error
7853
7854 VkGraphicsPipelineCreateInfo gp_ci = {};
7855 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7856 gp_ci.pNext = NULL;
7857 gp_ci.stageCount = 3;
7858 gp_ci.pStages = shaderStages;
7859 gp_ci.pVertexInputState = NULL;
7860 gp_ci.pInputAssemblyState = &iaCI;
7861 gp_ci.pTessellationState = &tsCI;
7862 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007863 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007864 gp_ci.pMultisampleState = NULL;
7865 gp_ci.pDepthStencilState = NULL;
7866 gp_ci.pColorBlendState = NULL;
7867 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7868 gp_ci.layout = pipeline_layout;
7869 gp_ci.renderPass = renderPass();
7870
7871 VkPipelineCacheCreateInfo pc_ci = {};
7872 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7873 pc_ci.pNext = NULL;
7874 pc_ci.initialSize = 0;
7875 pc_ci.initialData = 0;
7876 pc_ci.maxSize = 0;
7877
7878 VkPipeline pipeline;
7879 VkPipelineCache pipelineCache;
7880
Karl Schultz6addd812016-02-02 17:17:23 -07007881 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7882&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007883 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007884 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7885&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007886
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007887 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007888
Chia-I Wuf7458c52015-10-26 21:10:41 +08007889 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7890 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7891 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7892 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007893}
7894*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007895
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007896TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007897 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007898
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007899 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007900
Tony Barbour1fa09702017-03-16 12:09:08 -06007901 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007902 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007903
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007904 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007905 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7906 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007907
7908 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007909 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7910 ds_pool_ci.maxSets = 1;
7911 ds_pool_ci.poolSizeCount = 1;
7912 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007913
7914 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007915 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007916 ASSERT_VK_SUCCESS(err);
7917
7918 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007919 dsl_binding.binding = 0;
7920 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7921 dsl_binding.descriptorCount = 1;
7922 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007923
7924 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007925 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7926 ds_layout_ci.bindingCount = 1;
7927 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007928
7929 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007930 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007931 ASSERT_VK_SUCCESS(err);
7932
7933 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007934 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007935 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007936 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007937 alloc_info.descriptorPool = ds_pool;
7938 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007939 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007940 ASSERT_VK_SUCCESS(err);
7941
7942 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007943 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7944 pipeline_layout_ci.setLayoutCount = 1;
7945 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007946
7947 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007948 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007949 ASSERT_VK_SUCCESS(err);
7950
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007951 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007952 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007953 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007954 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007955 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007956 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007957
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007958 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7959 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7960 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7961 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7962 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7963 rs_state_ci.depthClampEnable = VK_FALSE;
7964 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7965 rs_state_ci.depthBiasEnable = VK_FALSE;
7966
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007967 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7968 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7969 vi_ci.pNext = nullptr;
7970 vi_ci.vertexBindingDescriptionCount = 0;
7971 vi_ci.pVertexBindingDescriptions = nullptr;
7972 vi_ci.vertexAttributeDescriptionCount = 0;
7973 vi_ci.pVertexAttributeDescriptions = nullptr;
7974
7975 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7976 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7977 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7978
7979 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7980 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7981 pipe_ms_state_ci.pNext = NULL;
7982 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7983 pipe_ms_state_ci.sampleShadingEnable = 0;
7984 pipe_ms_state_ci.minSampleShading = 1.0;
7985 pipe_ms_state_ci.pSampleMask = NULL;
7986
Cody Northropeb3a6c12015-10-05 14:44:45 -06007987 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007988 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007989
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007990 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007991 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007992 shaderStages[0] = vs.GetStageCreateInfo();
7993 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007994
7995 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007996 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7997 gp_ci.stageCount = 2;
7998 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007999 gp_ci.pVertexInputState = &vi_ci;
8000 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008001 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008002 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008003 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008004 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8005 gp_ci.layout = pipeline_layout;
8006 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008007
8008 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008009 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008010
8011 VkPipeline pipeline;
8012 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008013 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008014 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008015
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008016 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008017 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008018
8019 // Check case where multiViewport is disabled and viewport count is not 1
8020 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8021 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
8022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
8023 vp_state_ci.scissorCount = 0;
8024 vp_state_ci.viewportCount = 0;
8025 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8026 m_errorMonitor->VerifyFound();
8027 } else {
8028 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008029 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008030 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008031 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008032
8033 // Check is that viewportcount and scissorcount match
8034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
8035 vp_state_ci.scissorCount = 1;
8036 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8037 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8038 m_errorMonitor->VerifyFound();
8039
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008040 // Check case where multiViewport is enabled and viewport count is greater than max
8041 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8044 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8045 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8046 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8047 m_errorMonitor->VerifyFound();
8048 }
8049 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008050
Chia-I Wuf7458c52015-10-26 21:10:41 +08008051 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8052 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8053 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8054 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008055}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008056
8057// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
8058// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008059TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008060 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008061
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008062 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8063
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008065
Tony Barbour1fa09702017-03-16 12:09:08 -06008066 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008068
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008069 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008070 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8071 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008072
8073 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008074 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8075 ds_pool_ci.maxSets = 1;
8076 ds_pool_ci.poolSizeCount = 1;
8077 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008078
8079 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008080 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008081 ASSERT_VK_SUCCESS(err);
8082
8083 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008084 dsl_binding.binding = 0;
8085 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8086 dsl_binding.descriptorCount = 1;
8087 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008088
8089 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008090 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8091 ds_layout_ci.bindingCount = 1;
8092 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008093
8094 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008095 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008096 ASSERT_VK_SUCCESS(err);
8097
8098 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008099 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008100 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008101 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008102 alloc_info.descriptorPool = ds_pool;
8103 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008104 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008105 ASSERT_VK_SUCCESS(err);
8106
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008107 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8108 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8109 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8110
8111 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8112 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8113 vi_ci.pNext = nullptr;
8114 vi_ci.vertexBindingDescriptionCount = 0;
8115 vi_ci.pVertexBindingDescriptions = nullptr;
8116 vi_ci.vertexAttributeDescriptionCount = 0;
8117 vi_ci.pVertexAttributeDescriptions = nullptr;
8118
8119 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8120 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8121 pipe_ms_state_ci.pNext = NULL;
8122 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8123 pipe_ms_state_ci.sampleShadingEnable = 0;
8124 pipe_ms_state_ci.minSampleShading = 1.0;
8125 pipe_ms_state_ci.pSampleMask = NULL;
8126
Tobin Ehlise68360f2015-10-01 11:15:13 -06008127 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008128 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8129 pipeline_layout_ci.setLayoutCount = 1;
8130 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008131
8132 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008133 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008134 ASSERT_VK_SUCCESS(err);
8135
8136 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8137 // Set scissor as dynamic to avoid second error
8138 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008139 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8140 dyn_state_ci.dynamicStateCount = 1;
8141 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008142
Cody Northropeb3a6c12015-10-05 14:44:45 -06008143 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008144 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008145
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008146 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008147 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8148 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008149 shaderStages[0] = vs.GetStageCreateInfo();
8150 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008152 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8153 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8154 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8155 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8156 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8157 rs_state_ci.depthClampEnable = VK_FALSE;
8158 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8159 rs_state_ci.depthBiasEnable = VK_FALSE;
8160
Tobin Ehlise68360f2015-10-01 11:15:13 -06008161 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008162 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8163 gp_ci.stageCount = 2;
8164 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008165 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008166 // Not setting VP state w/o dynamic vp state should cause validation error
8167 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008168 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008169 gp_ci.pVertexInputState = &vi_ci;
8170 gp_ci.pInputAssemblyState = &ia_ci;
8171 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008172 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8173 gp_ci.layout = pipeline_layout;
8174 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008175
8176 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008177 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008178
8179 VkPipeline pipeline;
8180 VkPipelineCache pipelineCache;
8181
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008182 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008183 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008184 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008186 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008187
Chia-I Wuf7458c52015-10-26 21:10:41 +08008188 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8189 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8190 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8191 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008192}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008193
8194// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8195// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008196TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8197 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008198
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008200
Tony Barbour1fa09702017-03-16 12:09:08 -06008201 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008202
8203 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008204 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008205 return;
8206 }
8207
Tobin Ehlise68360f2015-10-01 11:15:13 -06008208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008209
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008210 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008211 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8212 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008213
8214 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008215 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8216 ds_pool_ci.maxSets = 1;
8217 ds_pool_ci.poolSizeCount = 1;
8218 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008219
8220 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008221 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008222 ASSERT_VK_SUCCESS(err);
8223
8224 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008225 dsl_binding.binding = 0;
8226 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8227 dsl_binding.descriptorCount = 1;
8228 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008229
8230 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008231 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8232 ds_layout_ci.bindingCount = 1;
8233 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008234
8235 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008236 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008237 ASSERT_VK_SUCCESS(err);
8238
8239 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008240 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008241 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008242 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008243 alloc_info.descriptorPool = ds_pool;
8244 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008245 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008246 ASSERT_VK_SUCCESS(err);
8247
8248 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008249 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8250 pipeline_layout_ci.setLayoutCount = 1;
8251 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008252
8253 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008254 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008255 ASSERT_VK_SUCCESS(err);
8256
8257 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008258 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8259 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008260 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008261 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008262 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008263
8264 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8265 // Set scissor as dynamic to avoid that error
8266 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008267 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8268 dyn_state_ci.dynamicStateCount = 1;
8269 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008270
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008271 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8272 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8273 pipe_ms_state_ci.pNext = NULL;
8274 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8275 pipe_ms_state_ci.sampleShadingEnable = 0;
8276 pipe_ms_state_ci.minSampleShading = 1.0;
8277 pipe_ms_state_ci.pSampleMask = NULL;
8278
Cody Northropeb3a6c12015-10-05 14:44:45 -06008279 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008280 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008281
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008282 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008283 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8284 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008285 shaderStages[0] = vs.GetStageCreateInfo();
8286 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008287
Cody Northropf6622dc2015-10-06 10:33:21 -06008288 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8289 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8290 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008291 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008292 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008293 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008294 vi_ci.pVertexAttributeDescriptions = nullptr;
8295
8296 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8297 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8298 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8299
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008300 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008301 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008302 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008303 rs_ci.pNext = nullptr;
8304
Mark Youngc89c6312016-03-31 16:03:20 -06008305 VkPipelineColorBlendAttachmentState att = {};
8306 att.blendEnable = VK_FALSE;
8307 att.colorWriteMask = 0xf;
8308
Cody Northropf6622dc2015-10-06 10:33:21 -06008309 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8310 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8311 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008312 cb_ci.attachmentCount = 1;
8313 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008314
Tobin Ehlise68360f2015-10-01 11:15:13 -06008315 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008316 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8317 gp_ci.stageCount = 2;
8318 gp_ci.pStages = shaderStages;
8319 gp_ci.pVertexInputState = &vi_ci;
8320 gp_ci.pInputAssemblyState = &ia_ci;
8321 gp_ci.pViewportState = &vp_state_ci;
8322 gp_ci.pRasterizationState = &rs_ci;
8323 gp_ci.pColorBlendState = &cb_ci;
8324 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008325 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008326 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8327 gp_ci.layout = pipeline_layout;
8328 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008329
8330 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008331 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008332
8333 VkPipeline pipeline;
8334 VkPipelineCache pipelineCache;
8335
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008336 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008337 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008338 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008339
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008340 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008341
Tobin Ehlisd332f282015-10-02 11:00:56 -06008342 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008343 // First need to successfully create the PSO from above by setting
8344 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, ");
Karl Schultz6addd812016-02-02 17:17:23 -07008346
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008347 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008348 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008349 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008350 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008351 m_commandBuffer->BeginCommandBuffer();
8352 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008353 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008354 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008355 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008356 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008357 Draw(1, 0, 0, 0);
8358
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008359 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008360
8361 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8362 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8363 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8364 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008365 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008366}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008367
8368// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008369// viewportCount
8370TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8371 VkResult err;
8372
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008374
Tony Barbour1fa09702017-03-16 12:09:08 -06008375 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008376
8377 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008378 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008379 return;
8380 }
8381
Karl Schultz6addd812016-02-02 17:17:23 -07008382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8383
8384 VkDescriptorPoolSize ds_type_count = {};
8385 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8386 ds_type_count.descriptorCount = 1;
8387
8388 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8389 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8390 ds_pool_ci.maxSets = 1;
8391 ds_pool_ci.poolSizeCount = 1;
8392 ds_pool_ci.pPoolSizes = &ds_type_count;
8393
8394 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008395 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008396 ASSERT_VK_SUCCESS(err);
8397
8398 VkDescriptorSetLayoutBinding dsl_binding = {};
8399 dsl_binding.binding = 0;
8400 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8401 dsl_binding.descriptorCount = 1;
8402 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8403
8404 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8405 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8406 ds_layout_ci.bindingCount = 1;
8407 ds_layout_ci.pBindings = &dsl_binding;
8408
8409 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008410 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008411 ASSERT_VK_SUCCESS(err);
8412
8413 VkDescriptorSet descriptorSet;
8414 VkDescriptorSetAllocateInfo alloc_info = {};
8415 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8416 alloc_info.descriptorSetCount = 1;
8417 alloc_info.descriptorPool = ds_pool;
8418 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008419 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008420 ASSERT_VK_SUCCESS(err);
8421
8422 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8423 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8424 pipeline_layout_ci.setLayoutCount = 1;
8425 pipeline_layout_ci.pSetLayouts = &ds_layout;
8426
8427 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008428 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008429 ASSERT_VK_SUCCESS(err);
8430
8431 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8432 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8433 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008434 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008435 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008436 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008437
8438 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8439 // Set scissor as dynamic to avoid that error
8440 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8441 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8442 dyn_state_ci.dynamicStateCount = 1;
8443 dyn_state_ci.pDynamicStates = &vp_state;
8444
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008445 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8446 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8447 pipe_ms_state_ci.pNext = NULL;
8448 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8449 pipe_ms_state_ci.sampleShadingEnable = 0;
8450 pipe_ms_state_ci.minSampleShading = 1.0;
8451 pipe_ms_state_ci.pSampleMask = NULL;
8452
Karl Schultz6addd812016-02-02 17:17:23 -07008453 VkPipelineShaderStageCreateInfo shaderStages[2];
8454 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8455
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008456 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008457 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8458 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07008459 shaderStages[0] = vs.GetStageCreateInfo();
8460 shaderStages[1] = fs.GetStageCreateInfo();
8461
8462 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8463 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8464 vi_ci.pNext = nullptr;
8465 vi_ci.vertexBindingDescriptionCount = 0;
8466 vi_ci.pVertexBindingDescriptions = nullptr;
8467 vi_ci.vertexAttributeDescriptionCount = 0;
8468 vi_ci.pVertexAttributeDescriptions = nullptr;
8469
8470 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8471 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8472 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8473
8474 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8475 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008476 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008477 rs_ci.pNext = nullptr;
8478
Mark Youngc89c6312016-03-31 16:03:20 -06008479 VkPipelineColorBlendAttachmentState att = {};
8480 att.blendEnable = VK_FALSE;
8481 att.colorWriteMask = 0xf;
8482
Karl Schultz6addd812016-02-02 17:17:23 -07008483 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8484 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8485 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008486 cb_ci.attachmentCount = 1;
8487 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008488
8489 VkGraphicsPipelineCreateInfo gp_ci = {};
8490 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8491 gp_ci.stageCount = 2;
8492 gp_ci.pStages = shaderStages;
8493 gp_ci.pVertexInputState = &vi_ci;
8494 gp_ci.pInputAssemblyState = &ia_ci;
8495 gp_ci.pViewportState = &vp_state_ci;
8496 gp_ci.pRasterizationState = &rs_ci;
8497 gp_ci.pColorBlendState = &cb_ci;
8498 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008499 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008500 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8501 gp_ci.layout = pipeline_layout;
8502 gp_ci.renderPass = renderPass();
8503
8504 VkPipelineCacheCreateInfo pc_ci = {};
8505 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8506
8507 VkPipeline pipeline;
8508 VkPipelineCache pipelineCache;
8509
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008510 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008511 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008512 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008513
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008514 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008515
8516 // Now hit second fail case where we set scissor w/ different count than PSO
8517 // First need to successfully create the PSO from above by setting
8518 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8520 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008521
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008522 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008523 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008524 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008525 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008526 m_commandBuffer->BeginCommandBuffer();
8527 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008528 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008529 VkViewport viewports[1] = {};
8530 viewports[0].width = 8;
8531 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008532 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008533 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008534 Draw(1, 0, 0, 0);
8535
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008536 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008537
Chia-I Wuf7458c52015-10-26 21:10:41 +08008538 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8539 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8540 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8541 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008542 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008543}
8544
Mark Young7394fdd2016-03-31 14:56:43 -06008545TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8546 VkResult err;
8547
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008549
Tony Barbour1fa09702017-03-16 12:09:08 -06008550 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8552
8553 VkDescriptorPoolSize ds_type_count = {};
8554 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8555 ds_type_count.descriptorCount = 1;
8556
8557 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8558 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8559 ds_pool_ci.maxSets = 1;
8560 ds_pool_ci.poolSizeCount = 1;
8561 ds_pool_ci.pPoolSizes = &ds_type_count;
8562
8563 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008564 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008565 ASSERT_VK_SUCCESS(err);
8566
8567 VkDescriptorSetLayoutBinding dsl_binding = {};
8568 dsl_binding.binding = 0;
8569 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8570 dsl_binding.descriptorCount = 1;
8571 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8572
8573 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8574 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8575 ds_layout_ci.bindingCount = 1;
8576 ds_layout_ci.pBindings = &dsl_binding;
8577
8578 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008579 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008580 ASSERT_VK_SUCCESS(err);
8581
8582 VkDescriptorSet descriptorSet;
8583 VkDescriptorSetAllocateInfo alloc_info = {};
8584 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8585 alloc_info.descriptorSetCount = 1;
8586 alloc_info.descriptorPool = ds_pool;
8587 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008588 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008589 ASSERT_VK_SUCCESS(err);
8590
8591 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8592 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8593 pipeline_layout_ci.setLayoutCount = 1;
8594 pipeline_layout_ci.pSetLayouts = &ds_layout;
8595
8596 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008597 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008598 ASSERT_VK_SUCCESS(err);
8599
8600 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8601 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8602 vp_state_ci.scissorCount = 1;
8603 vp_state_ci.pScissors = NULL;
8604 vp_state_ci.viewportCount = 1;
8605 vp_state_ci.pViewports = NULL;
8606
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008607 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008608 // Set scissor as dynamic to avoid that error
8609 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8610 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8611 dyn_state_ci.dynamicStateCount = 2;
8612 dyn_state_ci.pDynamicStates = dynamic_states;
8613
8614 VkPipelineShaderStageCreateInfo shaderStages[2];
8615 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8616
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008617 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8618 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008619 this); // TODO - We shouldn't need a fragment shader
8620 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008621 shaderStages[0] = vs.GetStageCreateInfo();
8622 shaderStages[1] = fs.GetStageCreateInfo();
8623
8624 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8625 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8626 vi_ci.pNext = nullptr;
8627 vi_ci.vertexBindingDescriptionCount = 0;
8628 vi_ci.pVertexBindingDescriptions = nullptr;
8629 vi_ci.vertexAttributeDescriptionCount = 0;
8630 vi_ci.pVertexAttributeDescriptions = nullptr;
8631
8632 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8633 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8634 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8635
8636 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8637 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8638 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008639 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008640
Mark Young47107952016-05-02 15:59:55 -06008641 // Check too low (line width of -1.0f).
8642 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008643
8644 VkPipelineColorBlendAttachmentState att = {};
8645 att.blendEnable = VK_FALSE;
8646 att.colorWriteMask = 0xf;
8647
8648 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8649 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8650 cb_ci.pNext = nullptr;
8651 cb_ci.attachmentCount = 1;
8652 cb_ci.pAttachments = &att;
8653
8654 VkGraphicsPipelineCreateInfo gp_ci = {};
8655 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8656 gp_ci.stageCount = 2;
8657 gp_ci.pStages = shaderStages;
8658 gp_ci.pVertexInputState = &vi_ci;
8659 gp_ci.pInputAssemblyState = &ia_ci;
8660 gp_ci.pViewportState = &vp_state_ci;
8661 gp_ci.pRasterizationState = &rs_ci;
8662 gp_ci.pColorBlendState = &cb_ci;
8663 gp_ci.pDynamicState = &dyn_state_ci;
8664 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8665 gp_ci.layout = pipeline_layout;
8666 gp_ci.renderPass = renderPass();
8667
8668 VkPipelineCacheCreateInfo pc_ci = {};
8669 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8670
8671 VkPipeline pipeline;
8672 VkPipelineCache pipelineCache;
8673
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008674 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008675 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008676 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008677
8678 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008679 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008680
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008682
8683 // Check too high (line width of 65536.0f).
8684 rs_ci.lineWidth = 65536.0f;
8685
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008686 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008687 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008688 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008689
8690 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008691 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008692
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008694
8695 dyn_state_ci.dynamicStateCount = 3;
8696
8697 rs_ci.lineWidth = 1.0f;
8698
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008699 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008700 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008701 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008702 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008703 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008704
8705 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008706 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008707 m_errorMonitor->VerifyFound();
8708
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008710
8711 // Check too high with dynamic setting.
8712 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8713 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008714 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008715
8716 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8717 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8718 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8719 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008720 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008721}
8722
Karl Schultz6addd812016-02-02 17:17:23 -07008723TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008724 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008726 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008727
Tony Barbour1fa09702017-03-16 12:09:08 -06008728 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008729 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008730
Tony Barbour552f6c02016-12-21 14:34:07 -07008731 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008732 // Don't care about RenderPass handle b/c error should be flagged before
8733 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008734 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008735
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008736 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008737}
8738
Karl Schultz6addd812016-02-02 17:17:23 -07008739TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008740 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8742 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008743
Tony Barbour1fa09702017-03-16 12:09:08 -06008744 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008746
Tony Barbour552f6c02016-12-21 14:34:07 -07008747 m_commandBuffer->BeginCommandBuffer();
8748 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008749 // Just create a dummy Renderpass that's non-NULL so we can get to the
8750 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008751 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008752
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008753 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008754}
8755
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008756TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008757 TEST_DESCRIPTION(
8758 "Begin a renderPass where clearValueCount is less than"
8759 "the number of renderPass attachments that use loadOp"
8760 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008761
Tony Barbour1fa09702017-03-16 12:09:08 -06008762 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8764
8765 // Create a renderPass with a single attachment that uses loadOp CLEAR
8766 VkAttachmentReference attach = {};
8767 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8768 VkSubpassDescription subpass = {};
8769 subpass.inputAttachmentCount = 1;
8770 subpass.pInputAttachments = &attach;
8771 VkRenderPassCreateInfo rpci = {};
8772 rpci.subpassCount = 1;
8773 rpci.pSubpasses = &subpass;
8774 rpci.attachmentCount = 1;
8775 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008776 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008777 // Set loadOp to CLEAR
8778 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8779 rpci.pAttachments = &attach_desc;
8780 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8781 VkRenderPass rp;
8782 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8783
8784 VkCommandBufferInheritanceInfo hinfo = {};
8785 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8786 hinfo.renderPass = VK_NULL_HANDLE;
8787 hinfo.subpass = 0;
8788 hinfo.framebuffer = VK_NULL_HANDLE;
8789 hinfo.occlusionQueryEnable = VK_FALSE;
8790 hinfo.queryFlags = 0;
8791 hinfo.pipelineStatistics = 0;
8792 VkCommandBufferBeginInfo info = {};
8793 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8794 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8795 info.pInheritanceInfo = &hinfo;
8796
8797 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8798 VkRenderPassBeginInfo rp_begin = {};
8799 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8800 rp_begin.pNext = NULL;
8801 rp_begin.renderPass = renderPass();
8802 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008803 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008804
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008806
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008807 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008808
8809 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008810
8811 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008812}
8813
Slawomir Cygan0808f392016-11-28 17:53:23 +01008814TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008815 TEST_DESCRIPTION(
8816 "Begin a renderPass where clearValueCount is greater than"
8817 "the number of renderPass attachments that use loadOp"
8818 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008819
Tony Barbour1fa09702017-03-16 12:09:08 -06008820 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008821 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8822
8823 // Create a renderPass with a single attachment that uses loadOp CLEAR
8824 VkAttachmentReference attach = {};
8825 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8826 VkSubpassDescription subpass = {};
8827 subpass.inputAttachmentCount = 1;
8828 subpass.pInputAttachments = &attach;
8829 VkRenderPassCreateInfo rpci = {};
8830 rpci.subpassCount = 1;
8831 rpci.pSubpasses = &subpass;
8832 rpci.attachmentCount = 1;
8833 VkAttachmentDescription attach_desc = {};
8834 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8835 // Set loadOp to CLEAR
8836 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8837 rpci.pAttachments = &attach_desc;
8838 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8839 VkRenderPass rp;
8840 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8841
8842 VkCommandBufferBeginInfo info = {};
8843 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8844 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8845
8846 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8847 VkRenderPassBeginInfo rp_begin = {};
8848 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8849 rp_begin.pNext = NULL;
8850 rp_begin.renderPass = renderPass();
8851 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008852 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008853
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8855 " has a clearValueCount of"
8856 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008857
8858 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8859
8860 m_errorMonitor->VerifyFound();
8861
8862 vkDestroyRenderPass(m_device->device(), rp, NULL);
8863}
8864
Cody Northrop3bb4d962016-05-09 16:15:57 -06008865TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008866 TEST_DESCRIPTION("End a command buffer with an active render pass");
8867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8869 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008870
Tony Barbour1fa09702017-03-16 12:09:08 -06008871 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008872 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8873
Tony Barbour552f6c02016-12-21 14:34:07 -07008874 m_commandBuffer->BeginCommandBuffer();
8875 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8876 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008877
8878 m_errorMonitor->VerifyFound();
8879
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008880 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8881 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008882}
8883
Karl Schultz6addd812016-02-02 17:17:23 -07008884TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008885 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8887 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008888
Tony Barbour1fa09702017-03-16 12:09:08 -06008889 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008890 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008891
Tony Barbour552f6c02016-12-21 14:34:07 -07008892 m_commandBuffer->BeginCommandBuffer();
8893 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008894
8895 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008896 vk_testing::Buffer dstBuffer;
8897 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008898
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008899 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008900
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008901 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008902}
8903
Karl Schultz6addd812016-02-02 17:17:23 -07008904TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008905 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8907 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008908
Tony Barbour1fa09702017-03-16 12:09:08 -06008909 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008910 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008911
Tony Barbour552f6c02016-12-21 14:34:07 -07008912 m_commandBuffer->BeginCommandBuffer();
8913 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008914
8915 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008916 vk_testing::Buffer dstBuffer;
8917 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008918
Karl Schultz6addd812016-02-02 17:17:23 -07008919 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008920 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8921 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8922 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008923
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008924 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008925}
8926
Karl Schultz6addd812016-02-02 17:17:23 -07008927TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008928 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8930 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008931
Tony Barbour1fa09702017-03-16 12:09:08 -06008932 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008933 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008934
Tony Barbour552f6c02016-12-21 14:34:07 -07008935 m_commandBuffer->BeginCommandBuffer();
8936 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008937
Michael Lentine0a369f62016-02-03 16:51:46 -06008938 VkClearColorValue clear_color;
8939 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008940 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8941 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8942 const int32_t tex_width = 32;
8943 const int32_t tex_height = 32;
8944 VkImageCreateInfo image_create_info = {};
8945 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8946 image_create_info.pNext = NULL;
8947 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8948 image_create_info.format = tex_format;
8949 image_create_info.extent.width = tex_width;
8950 image_create_info.extent.height = tex_height;
8951 image_create_info.extent.depth = 1;
8952 image_create_info.mipLevels = 1;
8953 image_create_info.arrayLayers = 1;
8954 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8955 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008956 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008957
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008958 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008959 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008960
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008961 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008962
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008963 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008964
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008965 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008966}
8967
Karl Schultz6addd812016-02-02 17:17:23 -07008968TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008969 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8971 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008972
Tony Barbour1fa09702017-03-16 12:09:08 -06008973 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008974 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008975
Dave Houlton1d2022c2017-03-29 11:43:58 -06008976 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008977 if (!depth_format) {
8978 printf(" No Depth + Stencil format found. Skipped.\n");
8979 return;
8980 }
8981
Tony Barbour552f6c02016-12-21 14:34:07 -07008982 m_commandBuffer->BeginCommandBuffer();
8983 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008984
8985 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008986 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008987 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8988 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008989 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008990 image_create_info.extent.width = 64;
8991 image_create_info.extent.height = 64;
8992 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8993 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008994
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008995 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008996 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008997
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008998 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008999
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009000 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9001 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009002
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009003 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009004}
9005
Karl Schultz6addd812016-02-02 17:17:23 -07009006TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009007 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009008 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009009
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9011 "vkCmdClearAttachments(): This call "
9012 "must be issued inside an active "
9013 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009014
Tony Barbour1fa09702017-03-16 12:09:08 -06009015 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009016 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009017
9018 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009019 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009020 ASSERT_VK_SUCCESS(err);
9021
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009022 VkClearAttachment color_attachment;
9023 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9024 color_attachment.clearValue.color.float32[0] = 0;
9025 color_attachment.clearValue.color.float32[1] = 0;
9026 color_attachment.clearValue.color.float32[2] = 0;
9027 color_attachment.clearValue.color.float32[3] = 0;
9028 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009029 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009030 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009031
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009032 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009033}
9034
Chris Forbes3b97e932016-09-07 11:29:24 +12009035TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009036 TEST_DESCRIPTION(
9037 "Test that an error is produced when CmdNextSubpass is "
9038 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009039
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9041 "vkCmdNextSubpass(): Attempted to advance "
9042 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009043
Tony Barbour1fa09702017-03-16 12:09:08 -06009044 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9046
Tony Barbour552f6c02016-12-21 14:34:07 -07009047 m_commandBuffer->BeginCommandBuffer();
9048 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009049
9050 // error here.
9051 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9052 m_errorMonitor->VerifyFound();
9053
Tony Barbour552f6c02016-12-21 14:34:07 -07009054 m_commandBuffer->EndRenderPass();
9055 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009056}
9057
Chris Forbes6d624702016-09-07 13:57:05 +12009058TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009059 TEST_DESCRIPTION(
9060 "Test that an error is produced when CmdEndRenderPass is "
9061 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009062
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9064 "vkCmdEndRenderPass(): Called before reaching "
9065 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009066
Tony Barbour1fa09702017-03-16 12:09:08 -06009067 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009068 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9069 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009070
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009071 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009072
9073 VkRenderPass rp;
9074 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9075 ASSERT_VK_SUCCESS(err);
9076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009077 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009078
9079 VkFramebuffer fb;
9080 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9081 ASSERT_VK_SUCCESS(err);
9082
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009083 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009084
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009085 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {16, 16}}, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009086
9087 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9088
9089 // Error here.
9090 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9091 m_errorMonitor->VerifyFound();
9092
9093 // Clean up.
9094 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9095 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9096}
9097
Karl Schultz9e66a292016-04-21 15:57:51 -06009098TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9099 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9101 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009102
Tony Barbour1fa09702017-03-16 12:09:08 -06009103 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009104 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009105
9106 VkBufferMemoryBarrier buf_barrier = {};
9107 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9108 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9109 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9110 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9111 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9112 buf_barrier.buffer = VK_NULL_HANDLE;
9113 buf_barrier.offset = 0;
9114 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009115 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9116 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009117
9118 m_errorMonitor->VerifyFound();
9119}
9120
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009121TEST_F(VkLayerTest, InvalidBarriers) {
9122 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9123
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009125
Tony Barbour1fa09702017-03-16 12:09:08 -06009126 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009127 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009128 if (!depth_format) {
9129 printf(" No Depth + Stencil format found. Skipped.\n");
9130 return;
9131 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009132 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9133
9134 VkMemoryBarrier mem_barrier = {};
9135 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9136 mem_barrier.pNext = NULL;
9137 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9138 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009139 m_commandBuffer->BeginCommandBuffer();
9140 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009141 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009142 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009143 &mem_barrier, 0, nullptr, 0, nullptr);
9144 m_errorMonitor->VerifyFound();
9145
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009147 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009148 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009149 ASSERT_TRUE(image.initialized());
9150 VkImageMemoryBarrier img_barrier = {};
9151 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9152 img_barrier.pNext = NULL;
9153 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9154 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9155 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9156 // New layout can't be UNDEFINED
9157 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9158 img_barrier.image = image.handle();
9159 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9160 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9161 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9162 img_barrier.subresourceRange.baseArrayLayer = 0;
9163 img_barrier.subresourceRange.baseMipLevel = 0;
9164 img_barrier.subresourceRange.layerCount = 1;
9165 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009166 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9167 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009168 m_errorMonitor->VerifyFound();
9169 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9170
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9172 "Subresource must have the sum of the "
9173 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009174 // baseArrayLayer + layerCount must be <= image's arrayLayers
9175 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009176 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9177 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009178 m_errorMonitor->VerifyFound();
9179 img_barrier.subresourceRange.baseArrayLayer = 0;
9180
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009182 // baseMipLevel + levelCount must be <= image's mipLevels
9183 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009184 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9185 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009186 m_errorMonitor->VerifyFound();
9187 img_barrier.subresourceRange.baseMipLevel = 0;
9188
Mike Weiblen7053aa32017-01-25 15:21:10 -07009189 // levelCount must be non-zero.
9190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9191 img_barrier.subresourceRange.levelCount = 0;
9192 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9193 nullptr, 0, nullptr, 1, &img_barrier);
9194 m_errorMonitor->VerifyFound();
9195 img_barrier.subresourceRange.levelCount = 1;
9196
9197 // layerCount must be non-zero.
9198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9199 img_barrier.subresourceRange.layerCount = 0;
9200 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9201 nullptr, 0, nullptr, 1, &img_barrier);
9202 m_errorMonitor->VerifyFound();
9203 img_barrier.subresourceRange.layerCount = 1;
9204
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer Barriers cannot be used during a render pass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009206 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009207 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9208 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009209 VkBufferMemoryBarrier buf_barrier = {};
9210 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9211 buf_barrier.pNext = NULL;
9212 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9213 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9214 buf_barrier.buffer = buffer.handle();
9215 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9216 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9217 buf_barrier.offset = 0;
9218 buf_barrier.size = VK_WHOLE_SIZE;
9219 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009220 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9221 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009222 m_errorMonitor->VerifyFound();
9223 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9224
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009226 buf_barrier.offset = 257;
9227 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009228 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9229 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009230 m_errorMonitor->VerifyFound();
9231 buf_barrier.offset = 0;
9232
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009234 buf_barrier.size = 257;
9235 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009236 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9237 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009238 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009239
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009240 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
9242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009243 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009244 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009245 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009246 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9247 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009248 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009249
9250 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009251 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009252 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9253 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009254 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009255
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009256 // Having only one of depth or stencil set for DS image is an error
9257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
9258 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
9259 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9260 nullptr, 0, nullptr, 1, &img_barrier);
9261 m_errorMonitor->VerifyFound();
9262
9263 // Having anything other than DEPTH and STENCIL is an error
9264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Dave Houltonfbf52152017-01-06 12:55:29 -07009265 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9266 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9267 nullptr, 0, nullptr, 1, &img_barrier);
9268 m_errorMonitor->VerifyFound();
9269
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009270 // Now test depth-only
9271 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009272 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9273 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009274 VkDepthStencilObj d_image(m_device);
9275 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9276 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009277 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009278 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009279 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009280
9281 // DEPTH bit must be set
9282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9283 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009284 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009285 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9286 0, nullptr, 0, nullptr, 1, &img_barrier);
9287 m_errorMonitor->VerifyFound();
9288
9289 // No bits other than DEPTH may be set
9290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9291 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9292 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009293 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9294 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009295 m_errorMonitor->VerifyFound();
9296 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009297
9298 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009299 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9300 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009301 VkDepthStencilObj s_image(m_device);
9302 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9303 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009304 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009305 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009306 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009307 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9309 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009310 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009311 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9312 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009313 m_errorMonitor->VerifyFound();
9314 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009315
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009316 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009317 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009318 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 -06009319 ASSERT_TRUE(c_image.initialized());
9320 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9321 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9322 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009323
9324 // COLOR bit must be set
9325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9326 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009327 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009328 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9329 nullptr, 0, nullptr, 1, &img_barrier);
9330 m_errorMonitor->VerifyFound();
9331
9332 // No bits other than COLOR may be set
9333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9334 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9335 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009336 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9337 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009338 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009339
Mike Weiblene6e01172017-03-07 22:18:40 -07009340 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9341 {
9342 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009343 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 -07009344 ASSERT_TRUE(img_color.initialized());
9345
9346 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009347 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 -07009348 ASSERT_TRUE(img_ds.initialized());
9349
9350 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009351 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 -07009352 ASSERT_TRUE(img_xfer_src.initialized());
9353
9354 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009355 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 -07009356 ASSERT_TRUE(img_xfer_dst.initialized());
9357
9358 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009359 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 -07009360 ASSERT_TRUE(img_sampled.initialized());
9361
9362 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009363 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 -07009364 ASSERT_TRUE(img_input.initialized());
9365
9366 const struct {
9367 VkImageObj &image_obj;
9368 VkImageLayout bad_layout;
9369 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9370 } bad_buffer_layouts[] = {
9371 // clang-format off
9372 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9373 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9374 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9375 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9376 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9377 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9378 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9379 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9380 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9381 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9382 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9383 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9384 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9385 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9386 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9387 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9388 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9389 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9390 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9391 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9392 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9393 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9394 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9395 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9396 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9397 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9398 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9399 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9400 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9401 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9402 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9403 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9404 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9405 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9406 // clang-format on
9407 };
9408 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9409
9410 for (uint32_t i = 0; i < layout_count; ++i) {
9411 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9412 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9413 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9414 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9415 : VK_IMAGE_ASPECT_COLOR_BIT;
9416
9417 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9418 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9420 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9421 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9422 m_errorMonitor->VerifyFound();
9423
9424 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9425 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9427 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9428 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9429 m_errorMonitor->VerifyFound();
9430 }
9431
9432 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9433 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9434 }
9435
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009436 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9437
9438 // Create command pool with incompatible queueflags
9439 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009440 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009441 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009442 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009443 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009444 }
9445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9446
9447 VkCommandPool command_pool;
9448 VkCommandPoolCreateInfo pool_create_info{};
9449 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9450 pool_create_info.queueFamilyIndex = queue_family_index;
9451 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9452 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9453
9454 // Allocate a command buffer
9455 VkCommandBuffer bad_command_buffer;
9456 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9457 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9458 command_buffer_allocate_info.commandPool = command_pool;
9459 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9460 command_buffer_allocate_info.commandBufferCount = 1;
9461 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9462
9463 VkCommandBufferBeginInfo cbbi = {};
9464 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9465 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9466 buf_barrier.offset = 0;
9467 buf_barrier.size = VK_WHOLE_SIZE;
9468 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9469 &buf_barrier, 0, nullptr);
9470 m_errorMonitor->VerifyFound();
9471
9472 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9473 vkEndCommandBuffer(bad_command_buffer);
9474 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009475 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009476 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009477 }
9478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9479 VkEvent event;
9480 VkEventCreateInfo event_create_info{};
9481 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9482 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9483 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9484 nullptr, 0, nullptr);
9485 m_errorMonitor->VerifyFound();
9486
9487 vkEndCommandBuffer(bad_command_buffer);
9488 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009489}
9490
Tony Barbour18ba25c2016-09-29 13:42:40 -06009491TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9492 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9493
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009495 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009496 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009497 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 -07009498 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009499 ASSERT_TRUE(image.initialized());
9500
9501 VkImageMemoryBarrier barrier = {};
9502 VkImageSubresourceRange range;
9503 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9504 barrier.srcAccessMask = 0;
9505 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9506 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9507 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9508 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9509 barrier.image = image.handle();
9510 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9511 range.baseMipLevel = 0;
9512 range.levelCount = 1;
9513 range.baseArrayLayer = 0;
9514 range.layerCount = 1;
9515 barrier.subresourceRange = range;
9516 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9517 cmdbuf.BeginCommandBuffer();
9518 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9519 &barrier);
9520 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9521 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9522 barrier.srcAccessMask = 0;
9523 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9524 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9525 &barrier);
9526
9527 m_errorMonitor->VerifyFound();
9528}
9529
Karl Schultz6addd812016-02-02 17:17:23 -07009530TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009531 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009532 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009533 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009534
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009535 uint32_t const indices[] = {0};
9536 VkBufferCreateInfo buf_info = {};
9537 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9538 buf_info.size = 1024;
9539 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9540 buf_info.queueFamilyIndexCount = 1;
9541 buf_info.pQueueFamilyIndices = indices;
9542
9543 VkBuffer buffer;
9544 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9545 ASSERT_VK_SUCCESS(err);
9546
9547 VkMemoryRequirements requirements;
9548 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9549
9550 VkMemoryAllocateInfo alloc_info{};
9551 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9552 alloc_info.pNext = NULL;
9553 alloc_info.memoryTypeIndex = 0;
9554 alloc_info.allocationSize = requirements.size;
9555 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9556 ASSERT_TRUE(pass);
9557
9558 VkDeviceMemory memory;
9559 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9560 ASSERT_VK_SUCCESS(err);
9561
9562 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009563 ASSERT_VK_SUCCESS(err);
9564
Tony Barbour552f6c02016-12-21 14:34:07 -07009565 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009566 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009567
Karl Schultz6addd812016-02-02 17:17:23 -07009568 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9569 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009570 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9572 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009573 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009574
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009575 vkFreeMemory(m_device->device(), memory, NULL);
9576 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009577}
9578
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009579TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9580 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009581 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009582 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9583 VkBufferCreateInfo buffCI = {};
9584 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9585 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009586 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009587 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009588 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009589 uint32_t qfi[2];
9590 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009591 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009592
9593 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009594 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009595
9596 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9598 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9599 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009600 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009601 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009602
9603 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009604 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9606
9607 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9608 buffCI.queueFamilyIndexCount = 2;
9609 qfi[0] = 1;
9610 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009611 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009612 VkDeviceMemory mem;
9613 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009614 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009615
9616 VkMemoryAllocateInfo alloc_info = {};
9617 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9618 alloc_info.allocationSize = 1024;
9619 bool pass = false;
9620 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9621 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009622 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009623 return;
9624 }
9625 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009626 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009627
9628 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009629 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009630 m_commandBuffer->end();
9631 QueueCommandBuffer(false);
9632 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009633 vkDestroyBuffer(m_device->device(), ib2, NULL);
9634 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009635 }
9636
Tony Barbourdf4c0042016-06-01 15:55:43 -06009637 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009638}
9639
Karl Schultz6addd812016-02-02 17:17:23 -07009640TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009641 TEST_DESCRIPTION(
9642 "Attempt vkCmdExecuteCommands with a primary command buffer"
9643 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009644
Tony Barbour1fa09702017-03-16 12:09:08 -06009645 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009646 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009647
Chris Forbesf29a84f2016-10-06 18:39:28 +13009648 // An empty primary command buffer
9649 VkCommandBufferObj cb(m_device, m_commandPool);
9650 cb.BeginCommandBuffer();
9651 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009652
Chris Forbesf29a84f2016-10-06 18:39:28 +13009653 m_commandBuffer->BeginCommandBuffer();
9654 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9655 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009656
Chris Forbesf29a84f2016-10-06 18:39:28 +13009657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9658 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009659 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009660
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -06009661 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009662}
9663
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009664TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009665 TEST_DESCRIPTION(
9666 "Attempt to update descriptor sets for images and buffers "
9667 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009668 VkResult err;
9669
Tony Barbour1fa09702017-03-16 12:09:08 -06009670 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009671 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9672 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9673 ds_type_count[i].type = VkDescriptorType(i);
9674 ds_type_count[i].descriptorCount = 1;
9675 }
9676 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9677 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9678 ds_pool_ci.pNext = NULL;
9679 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9680 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9681 ds_pool_ci.pPoolSizes = ds_type_count;
9682
9683 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009684 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009685 ASSERT_VK_SUCCESS(err);
9686
9687 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009688 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009689 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9690 dsl_binding[i].binding = 0;
9691 dsl_binding[i].descriptorType = VkDescriptorType(i);
9692 dsl_binding[i].descriptorCount = 1;
9693 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9694 dsl_binding[i].pImmutableSamplers = NULL;
9695 }
9696
9697 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9698 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9699 ds_layout_ci.pNext = NULL;
9700 ds_layout_ci.bindingCount = 1;
9701 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9702 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9703 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009704 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009705 ASSERT_VK_SUCCESS(err);
9706 }
9707 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9708 VkDescriptorSetAllocateInfo alloc_info = {};
9709 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9710 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9711 alloc_info.descriptorPool = ds_pool;
9712 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009713 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009714 ASSERT_VK_SUCCESS(err);
9715
9716 // Create a buffer & bufferView to be used for invalid updates
9717 VkBufferCreateInfo buff_ci = {};
9718 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009719 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009720 buff_ci.size = 256;
9721 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009722 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009723 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9724 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009725
9726 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9727 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9728 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9729 ASSERT_VK_SUCCESS(err);
9730
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009731 VkMemoryRequirements mem_reqs;
9732 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9733 VkMemoryAllocateInfo mem_alloc_info = {};
9734 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9735 mem_alloc_info.pNext = NULL;
9736 mem_alloc_info.memoryTypeIndex = 0;
9737 mem_alloc_info.allocationSize = mem_reqs.size;
9738 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9739 if (!pass) {
9740 vkDestroyBuffer(m_device->device(), buffer, NULL);
9741 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9742 return;
9743 }
9744 VkDeviceMemory mem;
9745 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9746 ASSERT_VK_SUCCESS(err);
9747 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9748 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009749
9750 VkBufferViewCreateInfo buff_view_ci = {};
9751 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9752 buff_view_ci.buffer = buffer;
9753 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9754 buff_view_ci.range = VK_WHOLE_SIZE;
9755 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009756 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009757 ASSERT_VK_SUCCESS(err);
9758
Tony Barbour415497c2017-01-24 10:06:09 -07009759 // Now get resources / view for storage_texel_buffer
9760 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9761 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9762 if (!pass) {
9763 vkDestroyBuffer(m_device->device(), buffer, NULL);
9764 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9765 vkFreeMemory(m_device->device(), mem, NULL);
9766 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9767 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9768 return;
9769 }
9770 VkDeviceMemory storage_texel_buffer_mem;
9771 VkBufferView storage_texel_buffer_view;
9772 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9773 ASSERT_VK_SUCCESS(err);
9774 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9775 ASSERT_VK_SUCCESS(err);
9776 buff_view_ci.buffer = storage_texel_buffer;
9777 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9778 ASSERT_VK_SUCCESS(err);
9779
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009780 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009781 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009782 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009783 image_ci.format = VK_FORMAT_UNDEFINED;
9784 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9785 VkFormat format = static_cast<VkFormat>(f);
9786 VkFormatProperties fProps = m_device->format_properties(format);
9787 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9788 image_ci.format = format;
9789 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9790 break;
9791 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9792 image_ci.format = format;
9793 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9794 break;
9795 }
9796 }
9797 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9798 return;
9799 }
9800
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009801 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9802 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009803 image_ci.extent.width = 64;
9804 image_ci.extent.height = 64;
9805 image_ci.extent.depth = 1;
9806 image_ci.mipLevels = 1;
9807 image_ci.arrayLayers = 1;
9808 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009809 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009810 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009811 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9812 VkImage image;
9813 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9814 ASSERT_VK_SUCCESS(err);
9815 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009816 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009817
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009818 VkMemoryAllocateInfo mem_alloc = {};
9819 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9820 mem_alloc.pNext = NULL;
9821 mem_alloc.allocationSize = 0;
9822 mem_alloc.memoryTypeIndex = 0;
9823 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9824 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009825 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009826 ASSERT_TRUE(pass);
9827 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9828 ASSERT_VK_SUCCESS(err);
9829 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9830 ASSERT_VK_SUCCESS(err);
9831 // Now create view for image
9832 VkImageViewCreateInfo image_view_ci = {};
9833 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9834 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009835 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009836 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9837 image_view_ci.subresourceRange.layerCount = 1;
9838 image_view_ci.subresourceRange.baseArrayLayer = 0;
9839 image_view_ci.subresourceRange.levelCount = 1;
9840 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9841 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009842 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009843 ASSERT_VK_SUCCESS(err);
9844
9845 VkDescriptorBufferInfo buff_info = {};
9846 buff_info.buffer = buffer;
9847 VkDescriptorImageInfo img_info = {};
9848 img_info.imageView = image_view;
9849 VkWriteDescriptorSet descriptor_write = {};
9850 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9851 descriptor_write.dstBinding = 0;
9852 descriptor_write.descriptorCount = 1;
9853 descriptor_write.pTexelBufferView = &buff_view;
9854 descriptor_write.pBufferInfo = &buff_info;
9855 descriptor_write.pImageInfo = &img_info;
9856
9857 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009858 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009859 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9860 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9861 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9862 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9863 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9864 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9865 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9866 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9867 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9868 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9869 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009870 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009871 // Start loop at 1 as SAMPLER desc type has no usage bit error
9872 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009873 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9874 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9875 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9876 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009877 descriptor_write.descriptorType = VkDescriptorType(i);
9878 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009880
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009881 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009882
9883 m_errorMonitor->VerifyFound();
9884 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009885 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9886 descriptor_write.pTexelBufferView = &buff_view;
9887 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009888 }
Tony Barbour415497c2017-01-24 10:06:09 -07009889
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009890 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9891 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009892 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009893 vkDestroyImageView(m_device->device(), image_view, NULL);
9894 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009895 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009896 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009897 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009898 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009899 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009900 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9901}
9902
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009903TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009904 TEST_DESCRIPTION(
9905 "Attempt to update buffer descriptor set that has incorrect "
9906 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009907 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009908 "2. range value of 0\n"
9909 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009910 VkResult err;
9911
Tony Barbour1fa09702017-03-16 12:09:08 -06009912 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009913 VkDescriptorPoolSize ds_type_count = {};
9914 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9915 ds_type_count.descriptorCount = 1;
9916
9917 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9918 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9919 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009920 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009921 ds_pool_ci.maxSets = 1;
9922 ds_pool_ci.poolSizeCount = 1;
9923 ds_pool_ci.pPoolSizes = &ds_type_count;
9924
9925 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009926 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009927 ASSERT_VK_SUCCESS(err);
9928
9929 // Create layout with single uniform buffer descriptor
9930 VkDescriptorSetLayoutBinding dsl_binding = {};
9931 dsl_binding.binding = 0;
9932 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9933 dsl_binding.descriptorCount = 1;
9934 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9935 dsl_binding.pImmutableSamplers = NULL;
9936
9937 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9938 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9939 ds_layout_ci.pNext = NULL;
9940 ds_layout_ci.bindingCount = 1;
9941 ds_layout_ci.pBindings = &dsl_binding;
9942 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009943 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009944 ASSERT_VK_SUCCESS(err);
9945
9946 VkDescriptorSet descriptor_set = {};
9947 VkDescriptorSetAllocateInfo alloc_info = {};
9948 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9949 alloc_info.descriptorSetCount = 1;
9950 alloc_info.descriptorPool = ds_pool;
9951 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009952 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009953 ASSERT_VK_SUCCESS(err);
9954
9955 // Create a buffer to be used for invalid updates
9956 VkBufferCreateInfo buff_ci = {};
9957 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9958 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009959 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009960 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9961 VkBuffer buffer;
9962 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9963 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009964
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009965 // Have to bind memory to buffer before descriptor update
9966 VkMemoryAllocateInfo mem_alloc = {};
9967 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9968 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009969 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009970 mem_alloc.memoryTypeIndex = 0;
9971
9972 VkMemoryRequirements mem_reqs;
9973 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009974 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009975 if (!pass) {
9976 vkDestroyBuffer(m_device->device(), buffer, NULL);
9977 return;
9978 }
9979
9980 VkDeviceMemory mem;
9981 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9982 ASSERT_VK_SUCCESS(err);
9983 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9984 ASSERT_VK_SUCCESS(err);
9985
9986 VkDescriptorBufferInfo buff_info = {};
9987 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009988 // Cause error due to offset out of range
9989 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009990 buff_info.range = VK_WHOLE_SIZE;
9991 VkWriteDescriptorSet descriptor_write = {};
9992 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9993 descriptor_write.dstBinding = 0;
9994 descriptor_write.descriptorCount = 1;
9995 descriptor_write.pTexelBufferView = nullptr;
9996 descriptor_write.pBufferInfo = &buff_info;
9997 descriptor_write.pImageInfo = nullptr;
9998
9999 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10000 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010002
10003 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10004
10005 m_errorMonitor->VerifyFound();
10006 // Now cause error due to range of 0
10007 buff_info.offset = 0;
10008 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010010
10011 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10012
10013 m_errorMonitor->VerifyFound();
10014 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010015 buff_info.offset = 0;
10016 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010018
10019 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10020
10021 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010022 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010023 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10024 vkDestroyBuffer(m_device->device(), buffer, NULL);
10025 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10026 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10027}
10028
Tobin Ehlis845887e2017-02-02 19:01:44 -070010029TEST_F(VkLayerTest, DSBufferLimitErrors) {
10030 TEST_DESCRIPTION(
10031 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10032 "Test cases include:\n"
10033 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10034 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10035 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10036 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10037 VkResult err;
10038
Tony Barbour1fa09702017-03-16 12:09:08 -060010039 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010040 VkDescriptorPoolSize ds_type_count[2] = {};
10041 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10042 ds_type_count[0].descriptorCount = 1;
10043 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10044 ds_type_count[1].descriptorCount = 1;
10045
10046 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10047 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10048 ds_pool_ci.pNext = NULL;
10049 ds_pool_ci.maxSets = 1;
10050 ds_pool_ci.poolSizeCount = 2;
10051 ds_pool_ci.pPoolSizes = ds_type_count;
10052
10053 VkDescriptorPool ds_pool;
10054 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10055 ASSERT_VK_SUCCESS(err);
10056
10057 // Create layout with single uniform buffer & single storage buffer descriptor
10058 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10059 dsl_binding[0].binding = 0;
10060 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10061 dsl_binding[0].descriptorCount = 1;
10062 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10063 dsl_binding[0].pImmutableSamplers = NULL;
10064 dsl_binding[1].binding = 1;
10065 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10066 dsl_binding[1].descriptorCount = 1;
10067 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10068 dsl_binding[1].pImmutableSamplers = NULL;
10069
10070 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10071 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10072 ds_layout_ci.pNext = NULL;
10073 ds_layout_ci.bindingCount = 2;
10074 ds_layout_ci.pBindings = dsl_binding;
10075 VkDescriptorSetLayout ds_layout;
10076 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10077 ASSERT_VK_SUCCESS(err);
10078
10079 VkDescriptorSet descriptor_set = {};
10080 VkDescriptorSetAllocateInfo alloc_info = {};
10081 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10082 alloc_info.descriptorSetCount = 1;
10083 alloc_info.descriptorPool = ds_pool;
10084 alloc_info.pSetLayouts = &ds_layout;
10085 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10086 ASSERT_VK_SUCCESS(err);
10087
10088 // Create a buffer to be used for invalid updates
10089 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10090 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10091 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10092 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10093 VkBufferCreateInfo ub_ci = {};
10094 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10095 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10096 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10097 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10098 VkBuffer uniform_buffer;
10099 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10100 ASSERT_VK_SUCCESS(err);
10101 VkBufferCreateInfo sb_ci = {};
10102 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10103 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10104 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10105 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10106 VkBuffer storage_buffer;
10107 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10108 ASSERT_VK_SUCCESS(err);
10109 // Have to bind memory to buffer before descriptor update
10110 VkMemoryAllocateInfo mem_alloc = {};
10111 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10112 mem_alloc.pNext = NULL;
10113 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10114 mem_alloc.memoryTypeIndex = 0;
10115
Cort Stratton77a0d592017-02-17 13:14:13 -080010116 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10117 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10118 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10119 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10120 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010121 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010122 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010123 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010124 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10125 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010126 return;
10127 }
10128
10129 VkDeviceMemory mem;
10130 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010131 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010132 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010133 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10134 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10135 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10136 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10137 return;
10138 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010139 ASSERT_VK_SUCCESS(err);
10140 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10141 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010142 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010143 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10144 ASSERT_VK_SUCCESS(err);
10145
10146 VkDescriptorBufferInfo buff_info = {};
10147 buff_info.buffer = uniform_buffer;
10148 buff_info.range = ub_ci.size; // This will exceed limit
10149 VkWriteDescriptorSet descriptor_write = {};
10150 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10151 descriptor_write.dstBinding = 0;
10152 descriptor_write.descriptorCount = 1;
10153 descriptor_write.pTexelBufferView = nullptr;
10154 descriptor_write.pBufferInfo = &buff_info;
10155 descriptor_write.pImageInfo = nullptr;
10156
10157 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10158 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010159 if (max_ub_range != UINT32_MAX) {
10160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10161 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10162 m_errorMonitor->VerifyFound();
10163 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010164 // Reduce size of range to acceptable limit & cause offset error
10165 buff_info.range = max_ub_range;
10166 buff_info.offset = min_ub_align - 1;
10167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10168 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10169 m_errorMonitor->VerifyFound();
10170
10171 // Now break storage updates
10172 buff_info.buffer = storage_buffer;
10173 buff_info.range = sb_ci.size; // This will exceed limit
10174 buff_info.offset = 0; // Reset offset for this update
10175
10176 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10177 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010178 if (max_ub_range != UINT32_MAX) {
10179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10180 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10181 m_errorMonitor->VerifyFound();
10182 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010183
10184 // Reduce size of range to acceptable limit & cause offset error
10185 buff_info.range = max_sb_range;
10186 buff_info.offset = min_sb_align - 1;
10187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10188 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10189 m_errorMonitor->VerifyFound();
10190
10191 vkFreeMemory(m_device->device(), mem, NULL);
10192 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10193 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10194 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10195 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10196}
10197
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010198TEST_F(VkLayerTest, DSAspectBitsErrors) {
10199 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10200 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010201 TEST_DESCRIPTION(
10202 "Attempt to update descriptor sets for images "
10203 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010204 VkResult err;
10205
Tony Barbour1fa09702017-03-16 12:09:08 -060010206 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010207 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010208 if (!depth_format) {
10209 printf(" No Depth + Stencil format found. Skipped.\n");
10210 return;
10211 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010212 VkDescriptorPoolSize ds_type_count = {};
10213 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10214 ds_type_count.descriptorCount = 1;
10215
10216 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10217 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10218 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010219 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010220 ds_pool_ci.maxSets = 5;
10221 ds_pool_ci.poolSizeCount = 1;
10222 ds_pool_ci.pPoolSizes = &ds_type_count;
10223
10224 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010225 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010226 ASSERT_VK_SUCCESS(err);
10227
10228 VkDescriptorSetLayoutBinding dsl_binding = {};
10229 dsl_binding.binding = 0;
10230 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10231 dsl_binding.descriptorCount = 1;
10232 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10233 dsl_binding.pImmutableSamplers = NULL;
10234
10235 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10236 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10237 ds_layout_ci.pNext = NULL;
10238 ds_layout_ci.bindingCount = 1;
10239 ds_layout_ci.pBindings = &dsl_binding;
10240 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010241 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010242 ASSERT_VK_SUCCESS(err);
10243
10244 VkDescriptorSet descriptor_set = {};
10245 VkDescriptorSetAllocateInfo alloc_info = {};
10246 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10247 alloc_info.descriptorSetCount = 1;
10248 alloc_info.descriptorPool = ds_pool;
10249 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010250 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010251 ASSERT_VK_SUCCESS(err);
10252
10253 // Create an image to be used for invalid updates
10254 VkImageCreateInfo image_ci = {};
10255 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10256 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010257 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010258 image_ci.extent.width = 64;
10259 image_ci.extent.height = 64;
10260 image_ci.extent.depth = 1;
10261 image_ci.mipLevels = 1;
10262 image_ci.arrayLayers = 1;
10263 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010264 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010265 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10266 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10267 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10268 VkImage image;
10269 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10270 ASSERT_VK_SUCCESS(err);
10271 // Bind memory to image
10272 VkMemoryRequirements mem_reqs;
10273 VkDeviceMemory image_mem;
10274 bool pass;
10275 VkMemoryAllocateInfo mem_alloc = {};
10276 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10277 mem_alloc.pNext = NULL;
10278 mem_alloc.allocationSize = 0;
10279 mem_alloc.memoryTypeIndex = 0;
10280 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10281 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010282 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010283 ASSERT_TRUE(pass);
10284 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10285 ASSERT_VK_SUCCESS(err);
10286 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10287 ASSERT_VK_SUCCESS(err);
10288 // Now create view for image
10289 VkImageViewCreateInfo image_view_ci = {};
10290 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10291 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010292 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010293 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10294 image_view_ci.subresourceRange.layerCount = 1;
10295 image_view_ci.subresourceRange.baseArrayLayer = 0;
10296 image_view_ci.subresourceRange.levelCount = 1;
10297 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010298 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010299
10300 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010301 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010302 ASSERT_VK_SUCCESS(err);
10303
10304 VkDescriptorImageInfo img_info = {};
10305 img_info.imageView = image_view;
10306 VkWriteDescriptorSet descriptor_write = {};
10307 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10308 descriptor_write.dstBinding = 0;
10309 descriptor_write.descriptorCount = 1;
10310 descriptor_write.pTexelBufferView = NULL;
10311 descriptor_write.pBufferInfo = NULL;
10312 descriptor_write.pImageInfo = &img_info;
10313 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10314 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010315 const char *error_msg =
10316 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10317 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010319
10320 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10321
10322 m_errorMonitor->VerifyFound();
10323 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10324 vkDestroyImage(m_device->device(), image, NULL);
10325 vkFreeMemory(m_device->device(), image_mem, NULL);
10326 vkDestroyImageView(m_device->device(), image_view, NULL);
10327 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10328 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10329}
10330
Karl Schultz6addd812016-02-02 17:17:23 -070010331TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010332 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010333 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010334
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10336 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10337 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010338
Tony Barbour1fa09702017-03-16 12:09:08 -060010339 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010340 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010341 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010342 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10343 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010344
10345 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010346 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10347 ds_pool_ci.pNext = NULL;
10348 ds_pool_ci.maxSets = 1;
10349 ds_pool_ci.poolSizeCount = 1;
10350 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010351
Tobin Ehlis3b780662015-05-28 12:11:26 -060010352 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010353 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010354 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010355 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010356 dsl_binding.binding = 0;
10357 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10358 dsl_binding.descriptorCount = 1;
10359 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10360 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010361
Tony Barboureb254902015-07-15 12:50:33 -060010362 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010363 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10364 ds_layout_ci.pNext = NULL;
10365 ds_layout_ci.bindingCount = 1;
10366 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010367
Tobin Ehlis3b780662015-05-28 12:11:26 -060010368 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010369 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010370 ASSERT_VK_SUCCESS(err);
10371
10372 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010373 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010374 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010375 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010376 alloc_info.descriptorPool = ds_pool;
10377 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010378 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010379 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010380
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010381 VkSamplerCreateInfo sampler_ci = {};
10382 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10383 sampler_ci.pNext = NULL;
10384 sampler_ci.magFilter = VK_FILTER_NEAREST;
10385 sampler_ci.minFilter = VK_FILTER_NEAREST;
10386 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10387 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10388 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10389 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10390 sampler_ci.mipLodBias = 1.0;
10391 sampler_ci.anisotropyEnable = VK_FALSE;
10392 sampler_ci.maxAnisotropy = 1;
10393 sampler_ci.compareEnable = VK_FALSE;
10394 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10395 sampler_ci.minLod = 1.0;
10396 sampler_ci.maxLod = 1.0;
10397 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10398 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10399 VkSampler sampler;
10400 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10401 ASSERT_VK_SUCCESS(err);
10402
10403 VkDescriptorImageInfo info = {};
10404 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010405
10406 VkWriteDescriptorSet descriptor_write;
10407 memset(&descriptor_write, 0, sizeof(descriptor_write));
10408 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010409 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010410 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010411 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010412 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010413 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010414
10415 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10416
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010417 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010418
Chia-I Wuf7458c52015-10-26 21:10:41 +080010419 vkDestroySampler(m_device->device(), sampler, NULL);
10420 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10421 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010422}
10423
Karl Schultz6addd812016-02-02 17:17:23 -070010424TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010425 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010426 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010427
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010429
Tony Barbour1fa09702017-03-16 12:09:08 -060010430 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010431 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010432 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010433 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10434 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010435
10436 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010437 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10438 ds_pool_ci.pNext = NULL;
10439 ds_pool_ci.maxSets = 1;
10440 ds_pool_ci.poolSizeCount = 1;
10441 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010442
Tobin Ehlis3b780662015-05-28 12:11:26 -060010443 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010444 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010445 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010446
Tony Barboureb254902015-07-15 12:50:33 -060010447 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010448 dsl_binding.binding = 0;
10449 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10450 dsl_binding.descriptorCount = 1;
10451 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10452 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010453
10454 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010455 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10456 ds_layout_ci.pNext = NULL;
10457 ds_layout_ci.bindingCount = 1;
10458 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010459
Tobin Ehlis3b780662015-05-28 12:11:26 -060010460 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010461 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010462 ASSERT_VK_SUCCESS(err);
10463
10464 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010465 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010466 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010467 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010468 alloc_info.descriptorPool = ds_pool;
10469 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010470 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010471 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010472
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010473 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10474
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010475 // Correctly update descriptor to avoid "NOT_UPDATED" error
10476 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010477 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010478 buff_info.offset = 0;
10479 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010480
10481 VkWriteDescriptorSet descriptor_write;
10482 memset(&descriptor_write, 0, sizeof(descriptor_write));
10483 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010484 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010485 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010486 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010487 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10488 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010489
10490 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10491
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010492 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010493
Chia-I Wuf7458c52015-10-26 21:10:41 +080010494 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10495 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010496}
10497
Karl Schultz6addd812016-02-02 17:17:23 -070010498TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010499 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010500 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010501
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010503
Tony Barbour1fa09702017-03-16 12:09:08 -060010504 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010505 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010506 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010507 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10508 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010509
10510 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010511 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10512 ds_pool_ci.pNext = NULL;
10513 ds_pool_ci.maxSets = 1;
10514 ds_pool_ci.poolSizeCount = 1;
10515 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010516
Tobin Ehlis3b780662015-05-28 12:11:26 -060010517 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010518 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010519 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010520
Tony Barboureb254902015-07-15 12:50:33 -060010521 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010522 dsl_binding.binding = 0;
10523 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10524 dsl_binding.descriptorCount = 1;
10525 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10526 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010527
10528 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010529 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10530 ds_layout_ci.pNext = NULL;
10531 ds_layout_ci.bindingCount = 1;
10532 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010533 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010534 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010535 ASSERT_VK_SUCCESS(err);
10536
10537 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010538 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010539 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010540 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010541 alloc_info.descriptorPool = ds_pool;
10542 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010543 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010544 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010545
Tony Barboureb254902015-07-15 12:50:33 -060010546 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010547 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10548 sampler_ci.pNext = NULL;
10549 sampler_ci.magFilter = VK_FILTER_NEAREST;
10550 sampler_ci.minFilter = VK_FILTER_NEAREST;
10551 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10552 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10553 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10554 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10555 sampler_ci.mipLodBias = 1.0;
10556 sampler_ci.anisotropyEnable = VK_FALSE;
10557 sampler_ci.maxAnisotropy = 1;
10558 sampler_ci.compareEnable = VK_FALSE;
10559 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10560 sampler_ci.minLod = 1.0;
10561 sampler_ci.maxLod = 1.0;
10562 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10563 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010564
Tobin Ehlis3b780662015-05-28 12:11:26 -060010565 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010566 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010567 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010568
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010569 VkDescriptorImageInfo info = {};
10570 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010571
10572 VkWriteDescriptorSet descriptor_write;
10573 memset(&descriptor_write, 0, sizeof(descriptor_write));
10574 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010575 descriptor_write.dstSet = descriptorSet;
10576 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010577 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010578 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010579 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010580 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010581
10582 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10583
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010584 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010585
Chia-I Wuf7458c52015-10-26 21:10:41 +080010586 vkDestroySampler(m_device->device(), sampler, NULL);
10587 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10588 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010589}
10590
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010591TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10592 // Create layout w/ empty binding and attempt to update it
10593 VkResult err;
10594
Tony Barbour1fa09702017-03-16 12:09:08 -060010595 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010596
10597 VkDescriptorPoolSize ds_type_count = {};
10598 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10599 ds_type_count.descriptorCount = 1;
10600
10601 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10602 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10603 ds_pool_ci.pNext = NULL;
10604 ds_pool_ci.maxSets = 1;
10605 ds_pool_ci.poolSizeCount = 1;
10606 ds_pool_ci.pPoolSizes = &ds_type_count;
10607
10608 VkDescriptorPool ds_pool;
10609 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10610 ASSERT_VK_SUCCESS(err);
10611
10612 VkDescriptorSetLayoutBinding dsl_binding = {};
10613 dsl_binding.binding = 0;
10614 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10615 dsl_binding.descriptorCount = 0;
10616 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10617 dsl_binding.pImmutableSamplers = NULL;
10618
10619 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10620 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10621 ds_layout_ci.pNext = NULL;
10622 ds_layout_ci.bindingCount = 1;
10623 ds_layout_ci.pBindings = &dsl_binding;
10624 VkDescriptorSetLayout ds_layout;
10625 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10626 ASSERT_VK_SUCCESS(err);
10627
10628 VkDescriptorSet descriptor_set;
10629 VkDescriptorSetAllocateInfo alloc_info = {};
10630 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10631 alloc_info.descriptorSetCount = 1;
10632 alloc_info.descriptorPool = ds_pool;
10633 alloc_info.pSetLayouts = &ds_layout;
10634 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10635 ASSERT_VK_SUCCESS(err);
10636
10637 VkSamplerCreateInfo sampler_ci = {};
10638 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10639 sampler_ci.magFilter = VK_FILTER_NEAREST;
10640 sampler_ci.minFilter = VK_FILTER_NEAREST;
10641 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10642 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10643 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10644 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10645 sampler_ci.mipLodBias = 1.0;
10646 sampler_ci.maxAnisotropy = 1;
10647 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10648 sampler_ci.minLod = 1.0;
10649 sampler_ci.maxLod = 1.0;
10650 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10651
10652 VkSampler sampler;
10653 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10654 ASSERT_VK_SUCCESS(err);
10655
10656 VkDescriptorImageInfo info = {};
10657 info.sampler = sampler;
10658
10659 VkWriteDescriptorSet descriptor_write;
10660 memset(&descriptor_write, 0, sizeof(descriptor_write));
10661 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10662 descriptor_write.dstSet = descriptor_set;
10663 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010664 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010665 // This is the wrong type, but empty binding error will be flagged first
10666 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10667 descriptor_write.pImageInfo = &info;
10668
10669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10670 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10671 m_errorMonitor->VerifyFound();
10672
10673 vkDestroySampler(m_device->device(), sampler, NULL);
10674 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10675 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10676}
10677
Karl Schultz6addd812016-02-02 17:17:23 -070010678TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10679 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10680 // types
10681 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010682
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010683 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 -060010684
Tony Barbour1fa09702017-03-16 12:09:08 -060010685 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010686
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010687 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010688 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10689 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010690
10691 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010692 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10693 ds_pool_ci.pNext = NULL;
10694 ds_pool_ci.maxSets = 1;
10695 ds_pool_ci.poolSizeCount = 1;
10696 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010697
Tobin Ehlis3b780662015-05-28 12:11:26 -060010698 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010699 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010700 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010701 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010702 dsl_binding.binding = 0;
10703 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10704 dsl_binding.descriptorCount = 1;
10705 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10706 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010707
Tony Barboureb254902015-07-15 12:50:33 -060010708 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010709 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10710 ds_layout_ci.pNext = NULL;
10711 ds_layout_ci.bindingCount = 1;
10712 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010713
Tobin Ehlis3b780662015-05-28 12:11:26 -060010714 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010715 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010716 ASSERT_VK_SUCCESS(err);
10717
10718 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010719 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010720 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010721 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010722 alloc_info.descriptorPool = ds_pool;
10723 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010724 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010725 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010726
Tony Barboureb254902015-07-15 12:50:33 -060010727 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010728 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10729 sampler_ci.pNext = NULL;
10730 sampler_ci.magFilter = VK_FILTER_NEAREST;
10731 sampler_ci.minFilter = VK_FILTER_NEAREST;
10732 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10733 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10734 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10735 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10736 sampler_ci.mipLodBias = 1.0;
10737 sampler_ci.anisotropyEnable = VK_FALSE;
10738 sampler_ci.maxAnisotropy = 1;
10739 sampler_ci.compareEnable = VK_FALSE;
10740 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10741 sampler_ci.minLod = 1.0;
10742 sampler_ci.maxLod = 1.0;
10743 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10744 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010745 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010746 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010747 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010748
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010749 VkDescriptorImageInfo info = {};
10750 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010751
10752 VkWriteDescriptorSet descriptor_write;
10753 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010754 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010755 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010756 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010757 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010758 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010759 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010760
10761 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10762
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010763 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010764
Chia-I Wuf7458c52015-10-26 21:10:41 +080010765 vkDestroySampler(m_device->device(), sampler, NULL);
10766 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10767 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010768}
10769
Karl Schultz6addd812016-02-02 17:17:23 -070010770TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010771 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010772 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010773
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010775
Tony Barbour1fa09702017-03-16 12:09:08 -060010776 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010777 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10778 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010779 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010780 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10781 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010782
10783 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010784 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10785 ds_pool_ci.pNext = NULL;
10786 ds_pool_ci.maxSets = 1;
10787 ds_pool_ci.poolSizeCount = 1;
10788 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010789
10790 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010791 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010792 ASSERT_VK_SUCCESS(err);
10793
10794 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010795 dsl_binding.binding = 0;
10796 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10797 dsl_binding.descriptorCount = 1;
10798 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10799 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010800
10801 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010802 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10803 ds_layout_ci.pNext = NULL;
10804 ds_layout_ci.bindingCount = 1;
10805 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010806 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010807 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010808 ASSERT_VK_SUCCESS(err);
10809
10810 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010811 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010812 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010813 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010814 alloc_info.descriptorPool = ds_pool;
10815 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010816 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010817 ASSERT_VK_SUCCESS(err);
10818
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010819 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010820
10821 VkDescriptorImageInfo descriptor_info;
10822 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10823 descriptor_info.sampler = sampler;
10824
10825 VkWriteDescriptorSet descriptor_write;
10826 memset(&descriptor_write, 0, sizeof(descriptor_write));
10827 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010828 descriptor_write.dstSet = descriptorSet;
10829 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010830 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010831 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10832 descriptor_write.pImageInfo = &descriptor_info;
10833
10834 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10835
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010836 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010837
Chia-I Wuf7458c52015-10-26 21:10:41 +080010838 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10839 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010840}
10841
Karl Schultz6addd812016-02-02 17:17:23 -070010842TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10843 // Create a single combined Image/Sampler descriptor and send it an invalid
10844 // imageView
10845 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010846
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010848
Tony Barbour1fa09702017-03-16 12:09:08 -060010849 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010850 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010851 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10852 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010853
10854 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010855 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10856 ds_pool_ci.pNext = NULL;
10857 ds_pool_ci.maxSets = 1;
10858 ds_pool_ci.poolSizeCount = 1;
10859 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010860
10861 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010862 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010863 ASSERT_VK_SUCCESS(err);
10864
10865 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010866 dsl_binding.binding = 0;
10867 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10868 dsl_binding.descriptorCount = 1;
10869 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10870 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010871
10872 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010873 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10874 ds_layout_ci.pNext = NULL;
10875 ds_layout_ci.bindingCount = 1;
10876 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010877 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010878 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010879 ASSERT_VK_SUCCESS(err);
10880
10881 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010882 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010883 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010884 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010885 alloc_info.descriptorPool = ds_pool;
10886 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010887 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010888 ASSERT_VK_SUCCESS(err);
10889
10890 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010891 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10892 sampler_ci.pNext = NULL;
10893 sampler_ci.magFilter = VK_FILTER_NEAREST;
10894 sampler_ci.minFilter = VK_FILTER_NEAREST;
10895 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10896 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10897 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10898 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10899 sampler_ci.mipLodBias = 1.0;
10900 sampler_ci.anisotropyEnable = VK_FALSE;
10901 sampler_ci.maxAnisotropy = 1;
10902 sampler_ci.compareEnable = VK_FALSE;
10903 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10904 sampler_ci.minLod = 1.0;
10905 sampler_ci.maxLod = 1.0;
10906 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10907 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010908
10909 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010910 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010911 ASSERT_VK_SUCCESS(err);
10912
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010913 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010914
10915 VkDescriptorImageInfo descriptor_info;
10916 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10917 descriptor_info.sampler = sampler;
10918 descriptor_info.imageView = view;
10919
10920 VkWriteDescriptorSet descriptor_write;
10921 memset(&descriptor_write, 0, sizeof(descriptor_write));
10922 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010923 descriptor_write.dstSet = descriptorSet;
10924 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010925 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010926 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10927 descriptor_write.pImageInfo = &descriptor_info;
10928
10929 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10930
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010931 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010932
Chia-I Wuf7458c52015-10-26 21:10:41 +080010933 vkDestroySampler(m_device->device(), sampler, NULL);
10934 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10935 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010936}
10937
Karl Schultz6addd812016-02-02 17:17:23 -070010938TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10939 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10940 // into the other
10941 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010942
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10944 " binding #1 with type "
10945 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10946 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010947
Tony Barbour1fa09702017-03-16 12:09:08 -060010948 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010949 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010950 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010951 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10952 ds_type_count[0].descriptorCount = 1;
10953 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10954 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010955
10956 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010957 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10958 ds_pool_ci.pNext = NULL;
10959 ds_pool_ci.maxSets = 1;
10960 ds_pool_ci.poolSizeCount = 2;
10961 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010962
10963 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010964 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010965 ASSERT_VK_SUCCESS(err);
10966 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010967 dsl_binding[0].binding = 0;
10968 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10969 dsl_binding[0].descriptorCount = 1;
10970 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10971 dsl_binding[0].pImmutableSamplers = NULL;
10972 dsl_binding[1].binding = 1;
10973 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10974 dsl_binding[1].descriptorCount = 1;
10975 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10976 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010977
10978 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010979 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10980 ds_layout_ci.pNext = NULL;
10981 ds_layout_ci.bindingCount = 2;
10982 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010983
10984 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010985 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010986 ASSERT_VK_SUCCESS(err);
10987
10988 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010989 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010990 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010991 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010992 alloc_info.descriptorPool = ds_pool;
10993 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010994 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010995 ASSERT_VK_SUCCESS(err);
10996
10997 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010998 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10999 sampler_ci.pNext = NULL;
11000 sampler_ci.magFilter = VK_FILTER_NEAREST;
11001 sampler_ci.minFilter = VK_FILTER_NEAREST;
11002 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11003 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11004 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11005 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11006 sampler_ci.mipLodBias = 1.0;
11007 sampler_ci.anisotropyEnable = VK_FALSE;
11008 sampler_ci.maxAnisotropy = 1;
11009 sampler_ci.compareEnable = VK_FALSE;
11010 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11011 sampler_ci.minLod = 1.0;
11012 sampler_ci.maxLod = 1.0;
11013 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11014 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011015
11016 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011017 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011018 ASSERT_VK_SUCCESS(err);
11019
11020 VkDescriptorImageInfo info = {};
11021 info.sampler = sampler;
11022
11023 VkWriteDescriptorSet descriptor_write;
11024 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11025 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011026 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011027 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011028 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011029 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11030 descriptor_write.pImageInfo = &info;
11031 // This write update should succeed
11032 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11033 // Now perform a copy update that fails due to type mismatch
11034 VkCopyDescriptorSet copy_ds_update;
11035 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11036 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11037 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011038 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011039 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011040 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11041 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011042 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11043
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011044 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011045 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011046 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 -060011047 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11048 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11049 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011050 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011051 copy_ds_update.dstSet = descriptorSet;
11052 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011053 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011054 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11055
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011056 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011057
Tobin Ehlis04356f92015-10-27 16:35:27 -060011058 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11060 " binding#1 with offset index of 1 plus "
11061 "update array offset of 0 and update of "
11062 "5 descriptors oversteps total number "
11063 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011064
Tobin Ehlis04356f92015-10-27 16:35:27 -060011065 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11066 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11067 copy_ds_update.srcSet = descriptorSet;
11068 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011069 copy_ds_update.dstSet = descriptorSet;
11070 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011071 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011072 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11073
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011074 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011075
Chia-I Wuf7458c52015-10-26 21:10:41 +080011076 vkDestroySampler(m_device->device(), sampler, NULL);
11077 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11078 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011079}
11080
Karl Schultz6addd812016-02-02 17:17:23 -070011081TEST_F(VkLayerTest, NumSamplesMismatch) {
11082 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11083 // sampleCount
11084 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011085
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011087
Tony Barbour1fa09702017-03-16 12:09:08 -060011088 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011089 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011090 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011091 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011092 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011093
11094 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011095 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11096 ds_pool_ci.pNext = NULL;
11097 ds_pool_ci.maxSets = 1;
11098 ds_pool_ci.poolSizeCount = 1;
11099 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011100
Tobin Ehlis3b780662015-05-28 12:11:26 -060011101 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011102 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011103 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011104
Tony Barboureb254902015-07-15 12:50:33 -060011105 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011106 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011107 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011108 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011109 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11110 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011111
Tony Barboureb254902015-07-15 12:50:33 -060011112 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11113 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11114 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011115 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011116 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011117
Tobin Ehlis3b780662015-05-28 12:11:26 -060011118 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011119 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011120 ASSERT_VK_SUCCESS(err);
11121
11122 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011123 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011124 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011125 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011126 alloc_info.descriptorPool = ds_pool;
11127 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011128 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011129 ASSERT_VK_SUCCESS(err);
11130
Tony Barboureb254902015-07-15 12:50:33 -060011131 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011132 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011133 pipe_ms_state_ci.pNext = NULL;
11134 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11135 pipe_ms_state_ci.sampleShadingEnable = 0;
11136 pipe_ms_state_ci.minSampleShading = 1.0;
11137 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011138
Tony Barboureb254902015-07-15 12:50:33 -060011139 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011140 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11141 pipeline_layout_ci.pNext = NULL;
11142 pipeline_layout_ci.setLayoutCount = 1;
11143 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011144
11145 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011146 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011147 ASSERT_VK_SUCCESS(err);
11148
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011149 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011150 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 -060011151 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011152 VkPipelineObj pipe(m_device);
11153 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011154 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011155 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011156 pipe.SetMSAA(&pipe_ms_state_ci);
11157 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011158
Tony Barbour552f6c02016-12-21 14:34:07 -070011159 m_commandBuffer->BeginCommandBuffer();
11160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011161 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011162
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011163 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11164 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11165 VkRect2D scissor = {{0, 0}, {16, 16}};
11166 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11167
Mark Young29927482016-05-04 14:38:51 -060011168 // Render triangle (the error should trigger on the attempt to draw).
11169 Draw(3, 1, 0, 0);
11170
11171 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011172 m_commandBuffer->EndRenderPass();
11173 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011174
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011175 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011176
Chia-I Wuf7458c52015-10-26 21:10:41 +080011177 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11178 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11179 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011180}
Mark Young29927482016-05-04 14:38:51 -060011181
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011182TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011183 TEST_DESCRIPTION(
11184 "Hit RenderPass incompatible cases. "
11185 "Initial case is drawing with an active renderpass that's "
11186 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011187 VkResult err;
11188
Tony Barbour1fa09702017-03-16 12:09:08 -060011189 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011190 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11191
11192 VkDescriptorSetLayoutBinding dsl_binding = {};
11193 dsl_binding.binding = 0;
11194 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11195 dsl_binding.descriptorCount = 1;
11196 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11197 dsl_binding.pImmutableSamplers = NULL;
11198
11199 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11200 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11201 ds_layout_ci.pNext = NULL;
11202 ds_layout_ci.bindingCount = 1;
11203 ds_layout_ci.pBindings = &dsl_binding;
11204
11205 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011206 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011207 ASSERT_VK_SUCCESS(err);
11208
11209 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11210 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11211 pipeline_layout_ci.pNext = NULL;
11212 pipeline_layout_ci.setLayoutCount = 1;
11213 pipeline_layout_ci.pSetLayouts = &ds_layout;
11214
11215 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011216 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011217 ASSERT_VK_SUCCESS(err);
11218
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011219 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011220 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 -060011221 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011222 // Create a renderpass that will be incompatible with default renderpass
11223 VkAttachmentReference attach = {};
11224 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11225 VkAttachmentReference color_att = {};
11226 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11227 VkSubpassDescription subpass = {};
11228 subpass.inputAttachmentCount = 1;
11229 subpass.pInputAttachments = &attach;
11230 subpass.colorAttachmentCount = 1;
11231 subpass.pColorAttachments = &color_att;
11232 VkRenderPassCreateInfo rpci = {};
11233 rpci.subpassCount = 1;
11234 rpci.pSubpasses = &subpass;
11235 rpci.attachmentCount = 1;
11236 VkAttachmentDescription attach_desc = {};
11237 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011238 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11239 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011240 rpci.pAttachments = &attach_desc;
11241 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11242 VkRenderPass rp;
11243 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11244 VkPipelineObj pipe(m_device);
11245 pipe.AddShader(&vs);
11246 pipe.AddShader(&fs);
11247 pipe.AddColorAttachment();
11248 VkViewport view_port = {};
11249 m_viewports.push_back(view_port);
11250 pipe.SetViewport(m_viewports);
11251 VkRect2D rect = {};
11252 m_scissors.push_back(rect);
11253 pipe.SetScissor(m_scissors);
11254 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11255
11256 VkCommandBufferInheritanceInfo cbii = {};
11257 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11258 cbii.renderPass = rp;
11259 cbii.subpass = 0;
11260 VkCommandBufferBeginInfo cbbi = {};
11261 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11262 cbbi.pInheritanceInfo = &cbii;
11263 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11264 VkRenderPassBeginInfo rpbi = {};
11265 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11266 rpbi.framebuffer = m_framebuffer;
11267 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011268 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11269 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011270
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011272 // Render triangle (the error should trigger on the attempt to draw).
11273 Draw(3, 1, 0, 0);
11274
11275 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011276 m_commandBuffer->EndRenderPass();
11277 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011278
11279 m_errorMonitor->VerifyFound();
11280
11281 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11282 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11283 vkDestroyRenderPass(m_device->device(), rp, NULL);
11284}
11285
Mark Youngc89c6312016-03-31 16:03:20 -060011286TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11287 // Create Pipeline where the number of blend attachments doesn't match the
11288 // number of color attachments. In this case, we don't add any color
11289 // blend attachments even though we have a color attachment.
11290 VkResult err;
11291
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011293
Tony Barbour1fa09702017-03-16 12:09:08 -060011294 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011295 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11296 VkDescriptorPoolSize ds_type_count = {};
11297 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11298 ds_type_count.descriptorCount = 1;
11299
11300 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11301 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11302 ds_pool_ci.pNext = NULL;
11303 ds_pool_ci.maxSets = 1;
11304 ds_pool_ci.poolSizeCount = 1;
11305 ds_pool_ci.pPoolSizes = &ds_type_count;
11306
11307 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011308 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011309 ASSERT_VK_SUCCESS(err);
11310
11311 VkDescriptorSetLayoutBinding dsl_binding = {};
11312 dsl_binding.binding = 0;
11313 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11314 dsl_binding.descriptorCount = 1;
11315 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11316 dsl_binding.pImmutableSamplers = NULL;
11317
11318 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11319 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11320 ds_layout_ci.pNext = NULL;
11321 ds_layout_ci.bindingCount = 1;
11322 ds_layout_ci.pBindings = &dsl_binding;
11323
11324 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011325 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011326 ASSERT_VK_SUCCESS(err);
11327
11328 VkDescriptorSet descriptorSet;
11329 VkDescriptorSetAllocateInfo alloc_info = {};
11330 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11331 alloc_info.descriptorSetCount = 1;
11332 alloc_info.descriptorPool = ds_pool;
11333 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011334 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011335 ASSERT_VK_SUCCESS(err);
11336
11337 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011338 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011339 pipe_ms_state_ci.pNext = NULL;
11340 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11341 pipe_ms_state_ci.sampleShadingEnable = 0;
11342 pipe_ms_state_ci.minSampleShading = 1.0;
11343 pipe_ms_state_ci.pSampleMask = NULL;
11344
11345 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11346 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11347 pipeline_layout_ci.pNext = NULL;
11348 pipeline_layout_ci.setLayoutCount = 1;
11349 pipeline_layout_ci.pSetLayouts = &ds_layout;
11350
11351 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011352 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011353 ASSERT_VK_SUCCESS(err);
11354
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011355 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011356 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 -060011357 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011358 VkPipelineObj pipe(m_device);
11359 pipe.AddShader(&vs);
11360 pipe.AddShader(&fs);
11361 pipe.SetMSAA(&pipe_ms_state_ci);
11362 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011363 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011364
11365 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11366 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11367 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11368}
Mark Young29927482016-05-04 14:38:51 -060011369
Mark Muellerd4914412016-06-13 17:52:06 -060011370TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011371 TEST_DESCRIPTION(
11372 "Points to a wrong colorAttachment index in a VkClearAttachment "
11373 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011374 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011376
11377 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11378 m_errorMonitor->VerifyFound();
11379}
11380
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011381TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011382 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11383 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011384
Tony Barbour1fa09702017-03-16 12:09:08 -060011385 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011387
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011388 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011389 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11390 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011391
11392 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011393 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11394 ds_pool_ci.pNext = NULL;
11395 ds_pool_ci.maxSets = 1;
11396 ds_pool_ci.poolSizeCount = 1;
11397 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011398
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011399 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011400 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011401 ASSERT_VK_SUCCESS(err);
11402
Tony Barboureb254902015-07-15 12:50:33 -060011403 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011404 dsl_binding.binding = 0;
11405 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11406 dsl_binding.descriptorCount = 1;
11407 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11408 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011409
Tony Barboureb254902015-07-15 12:50:33 -060011410 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011411 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11412 ds_layout_ci.pNext = NULL;
11413 ds_layout_ci.bindingCount = 1;
11414 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011415
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011416 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011417 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -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;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -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 Ehlis53eddda2015-07-01 16:46:13 -060011427 ASSERT_VK_SUCCESS(err);
11428
Tony Barboureb254902015-07-15 12:50:33 -060011429 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011430 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011431 pipe_ms_state_ci.pNext = NULL;
11432 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11433 pipe_ms_state_ci.sampleShadingEnable = 0;
11434 pipe_ms_state_ci.minSampleShading = 1.0;
11435 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011436
Tony Barboureb254902015-07-15 12:50:33 -060011437 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011438 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11439 pipeline_layout_ci.pNext = NULL;
11440 pipeline_layout_ci.setLayoutCount = 1;
11441 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011442
11443 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011444 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011445 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011446
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011447 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011448 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011449 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011450 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011451
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011452 VkPipelineObj pipe(m_device);
11453 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011454 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011455 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011456 pipe.SetMSAA(&pipe_ms_state_ci);
11457 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011458
Tony Barbour552f6c02016-12-21 14:34:07 -070011459 m_commandBuffer->BeginCommandBuffer();
11460 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011461
Karl Schultz6addd812016-02-02 17:17:23 -070011462 // Main thing we care about for this test is that the VkImage obj we're
11463 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011464 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011465 VkClearAttachment color_attachment;
11466 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11467 color_attachment.clearValue.color.float32[0] = 1.0;
11468 color_attachment.clearValue.color.float32[1] = 1.0;
11469 color_attachment.clearValue.color.float32[2] = 1.0;
11470 color_attachment.clearValue.color.float32[3] = 1.0;
11471 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011472 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011473
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011474 // Call for full-sized FB Color attachment prior to issuing a Draw
11475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011476 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011477 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011478 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011479
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011480 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11481 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11483 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11484 m_errorMonitor->VerifyFound();
11485
11486 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11487 clear_rect.layerCount = 2;
11488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11489 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011490 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011491
Chia-I Wuf7458c52015-10-26 21:10:41 +080011492 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11493 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11494 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011495}
11496
Karl Schultz6addd812016-02-02 17:17:23 -070011497TEST_F(VkLayerTest, VtxBufferBadIndex) {
11498 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011499
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11501 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011502
Tony Barbour1fa09702017-03-16 12:09:08 -060011503 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011504 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011505 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011506
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011507 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011508 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11509 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011510
11511 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011512 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11513 ds_pool_ci.pNext = NULL;
11514 ds_pool_ci.maxSets = 1;
11515 ds_pool_ci.poolSizeCount = 1;
11516 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011517
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011518 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011519 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011520 ASSERT_VK_SUCCESS(err);
11521
Tony Barboureb254902015-07-15 12:50:33 -060011522 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011523 dsl_binding.binding = 0;
11524 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11525 dsl_binding.descriptorCount = 1;
11526 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11527 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011528
Tony Barboureb254902015-07-15 12:50:33 -060011529 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011530 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11531 ds_layout_ci.pNext = NULL;
11532 ds_layout_ci.bindingCount = 1;
11533 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011534
Tobin Ehlis502480b2015-06-24 15:53:07 -060011535 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011536 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011537 ASSERT_VK_SUCCESS(err);
11538
11539 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011540 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011541 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011542 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011543 alloc_info.descriptorPool = ds_pool;
11544 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011545 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011546 ASSERT_VK_SUCCESS(err);
11547
Tony Barboureb254902015-07-15 12:50:33 -060011548 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011549 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011550 pipe_ms_state_ci.pNext = NULL;
11551 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11552 pipe_ms_state_ci.sampleShadingEnable = 0;
11553 pipe_ms_state_ci.minSampleShading = 1.0;
11554 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011555
Tony Barboureb254902015-07-15 12:50:33 -060011556 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011557 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11558 pipeline_layout_ci.pNext = NULL;
11559 pipeline_layout_ci.setLayoutCount = 1;
11560 pipeline_layout_ci.pSetLayouts = &ds_layout;
11561 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011562
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011563 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011564 ASSERT_VK_SUCCESS(err);
11565
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011566 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011567 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 -060011568 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011569 VkPipelineObj pipe(m_device);
11570 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011571 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011572 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011573 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011574 pipe.SetViewport(m_viewports);
11575 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011576 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011577
Tony Barbour552f6c02016-12-21 14:34:07 -070011578 m_commandBuffer->BeginCommandBuffer();
11579 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011580 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011581 // Don't care about actual data, just need to get to draw to flag error
11582 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011583 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011584 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011585 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011586
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011587 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011588
Chia-I Wuf7458c52015-10-26 21:10:41 +080011589 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11590 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11591 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011592}
Mark Muellerdfe37552016-07-07 14:47:42 -060011593
Mark Mueller2ee294f2016-08-04 12:59:48 -060011594TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011595 TEST_DESCRIPTION(
11596 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11597 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011598 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011599
Mark Mueller880fce52016-08-17 15:23:23 -060011600 // The following test fails with recent NVidia drivers.
11601 // By the time core_validation is reached, the NVidia
11602 // driver has sanitized the invalid condition and core_validation
11603 // is not introduced to the failure condition. This is not the case
11604 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011605 // uint32_t count = static_cast<uint32_t>(~0);
11606 // VkPhysicalDevice physical_device;
11607 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11608 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011609
Mark Mueller2ee294f2016-08-04 12:59:48 -060011610 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011611 VkDeviceQueueCreateInfo queue_create_info = {};
11612 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11613 queue_create_info.queueCount = 1;
11614 queue_create_info.pQueuePriorities = &queue_priority;
11615 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11616
11617 VkPhysicalDeviceFeatures features = m_device->phy().features();
11618 VkDevice testDevice;
11619 VkDeviceCreateInfo device_create_info = {};
11620 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11621 device_create_info.queueCreateInfoCount = 1;
11622 device_create_info.pQueueCreateInfos = &queue_create_info;
11623 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011624
11625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11626 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011627 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11628 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11629 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011630 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11631 m_errorMonitor->VerifyFound();
11632
11633 queue_create_info.queueFamilyIndex = 1;
11634
11635 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11636 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11637 for (unsigned i = 0; i < feature_count; i++) {
11638 if (VK_FALSE == feature_array[i]) {
11639 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011640 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11642 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011643 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11644 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11645 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11647 "You requested features that are unavailable on this device. You should first "
11648 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011649 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11650 m_errorMonitor->VerifyFound();
11651 break;
11652 }
11653 }
11654}
11655
Tobin Ehlis16edf082016-11-21 12:33:49 -070011656TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11657 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11658
Tony Barbour1fa09702017-03-16 12:09:08 -060011659 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011660
11661 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11662 std::vector<VkDeviceQueueCreateInfo> queue_info;
11663 queue_info.reserve(queue_props.size());
11664 std::vector<std::vector<float>> queue_priorities;
11665 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11666 VkDeviceQueueCreateInfo qi{};
11667 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11668 qi.queueFamilyIndex = i;
11669 qi.queueCount = queue_props[i].queueCount;
11670 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11671 qi.pQueuePriorities = queue_priorities[i].data();
11672 queue_info.push_back(qi);
11673 }
11674
11675 std::vector<const char *> device_extension_names;
11676
11677 VkDevice local_device;
11678 VkDeviceCreateInfo device_create_info = {};
11679 auto features = m_device->phy().features();
11680 // Intentionally disable pipeline stats
11681 features.pipelineStatisticsQuery = VK_FALSE;
11682 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11683 device_create_info.pNext = NULL;
11684 device_create_info.queueCreateInfoCount = queue_info.size();
11685 device_create_info.pQueueCreateInfos = queue_info.data();
11686 device_create_info.enabledLayerCount = 0;
11687 device_create_info.ppEnabledLayerNames = NULL;
11688 device_create_info.pEnabledFeatures = &features;
11689 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11690 ASSERT_VK_SUCCESS(err);
11691
11692 VkQueryPoolCreateInfo qpci{};
11693 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11694 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11695 qpci.queryCount = 1;
11696 VkQueryPool query_pool;
11697
11698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11699 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11700 m_errorMonitor->VerifyFound();
11701
11702 vkDestroyDevice(local_device, nullptr);
11703}
11704
Mark Mueller2ee294f2016-08-04 12:59:48 -060011705TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011706 TEST_DESCRIPTION(
11707 "Use an invalid queue index in a vkCmdWaitEvents call."
11708 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011709
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011710 const char *invalid_queue_index =
11711 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11712 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11713 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011714
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011715 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011716
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011718
Tony Barbour1fa09702017-03-16 12:09:08 -060011719 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011720
11721 VkEvent event;
11722 VkEventCreateInfo event_create_info{};
11723 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11724 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11725
Mark Mueller2ee294f2016-08-04 12:59:48 -060011726 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011727 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011728
Tony Barbour552f6c02016-12-21 14:34:07 -070011729 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011730
11731 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060011732 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 -060011733 ASSERT_TRUE(image.initialized());
11734 VkImageMemoryBarrier img_barrier = {};
11735 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11736 img_barrier.pNext = NULL;
11737 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11738 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11739 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11740 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11741 img_barrier.image = image.handle();
11742 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011743
11744 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11745 // that layer validation catches the case when it is not.
11746 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011747 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11748 img_barrier.subresourceRange.baseArrayLayer = 0;
11749 img_barrier.subresourceRange.baseMipLevel = 0;
11750 img_barrier.subresourceRange.layerCount = 1;
11751 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011752 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11753 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011754 m_errorMonitor->VerifyFound();
11755
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011757
11758 VkQueryPool query_pool;
11759 VkQueryPoolCreateInfo query_pool_create_info = {};
11760 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11761 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11762 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011763 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011764
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011765 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011766 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11767
11768 vkEndCommandBuffer(m_commandBuffer->handle());
11769 m_errorMonitor->VerifyFound();
11770
11771 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11772 vkDestroyEvent(m_device->device(), event, nullptr);
11773}
11774
Mark Muellerdfe37552016-07-07 14:47:42 -060011775TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011776 TEST_DESCRIPTION(
11777 "Submit a command buffer using deleted vertex buffer, "
11778 "delete a buffer twice, use an invalid offset for each "
11779 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011780
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011781 const char *deleted_buffer_in_command_buffer =
11782 "Cannot submit cmd buffer "
11783 "using deleted buffer ";
11784 const char *invalid_offset_message =
11785 "vkBindBufferMemory(): "
11786 "memoryOffset is 0x";
11787 const char *invalid_storage_buffer_offset_message =
11788 "vkBindBufferMemory(): "
11789 "storage memoryOffset "
11790 "is 0x";
11791 const char *invalid_texel_buffer_offset_message =
11792 "vkBindBufferMemory(): "
11793 "texel memoryOffset "
11794 "is 0x";
11795 const char *invalid_uniform_buffer_offset_message =
11796 "vkBindBufferMemory(): "
11797 "uniform memoryOffset "
11798 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011799
Tony Barbour1fa09702017-03-16 12:09:08 -060011800 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011801 ASSERT_NO_FATAL_FAILURE(InitViewport());
11802 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11803
11804 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011805 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011806 pipe_ms_state_ci.pNext = NULL;
11807 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11808 pipe_ms_state_ci.sampleShadingEnable = 0;
11809 pipe_ms_state_ci.minSampleShading = 1.0;
11810 pipe_ms_state_ci.pSampleMask = nullptr;
11811
11812 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11813 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11814 VkPipelineLayout pipeline_layout;
11815
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011816 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011817 ASSERT_VK_SUCCESS(err);
11818
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011819 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11820 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011821 VkPipelineObj pipe(m_device);
11822 pipe.AddShader(&vs);
11823 pipe.AddShader(&fs);
11824 pipe.AddColorAttachment();
11825 pipe.SetMSAA(&pipe_ms_state_ci);
11826 pipe.SetViewport(m_viewports);
11827 pipe.SetScissor(m_scissors);
11828 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11829
Tony Barbour552f6c02016-12-21 14:34:07 -070011830 m_commandBuffer->BeginCommandBuffer();
11831 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011832 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011833
11834 {
11835 // Create and bind a vertex buffer in a reduced scope, which will cause
11836 // it to be deleted upon leaving this scope
11837 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011838 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011839 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11840 draw_verticies.AddVertexInputToPipe(pipe);
11841 }
11842
11843 Draw(1, 0, 0, 0);
11844
Tony Barbour552f6c02016-12-21 14:34:07 -070011845 m_commandBuffer->EndRenderPass();
11846 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011847
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011849 QueueCommandBuffer(false);
11850 m_errorMonitor->VerifyFound();
11851
11852 {
11853 // Create and bind a vertex buffer in a reduced scope, and delete it
11854 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011855 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011857 buffer_test.TestDoubleDestroy();
11858 }
11859 m_errorMonitor->VerifyFound();
11860
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011861 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011862 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011863 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011865 m_errorMonitor->SetUnexpectedError(
11866 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11867 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011868 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11869 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011870 m_errorMonitor->VerifyFound();
11871 }
11872
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011873 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11874 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011875 // Create and bind a memory buffer with an invalid offset again,
11876 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011878 m_errorMonitor->SetUnexpectedError(
11879 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11880 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011881 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11882 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011883 m_errorMonitor->VerifyFound();
11884 }
11885
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011886 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011887 // Create and bind a memory buffer with an invalid offset again, but
11888 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011890 m_errorMonitor->SetUnexpectedError(
11891 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11892 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011893 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11894 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011895 m_errorMonitor->VerifyFound();
11896 }
11897
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011898 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011899 // Create and bind a memory buffer with an invalid offset again, but
11900 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011902 m_errorMonitor->SetUnexpectedError(
11903 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11904 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011905 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11906 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011907 m_errorMonitor->VerifyFound();
11908 }
11909
11910 {
11911 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011913 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11914 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011915 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11916 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011917 m_errorMonitor->VerifyFound();
11918 }
11919
11920 {
11921 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011923 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11924 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011925 }
11926 m_errorMonitor->VerifyFound();
11927
11928 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11929}
11930
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011931// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11932TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011933 TEST_DESCRIPTION(
11934 "Hit all possible validation checks associated with the "
11935 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11936 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011937 // 3 in ValidateCmdBufImageLayouts
11938 // * -1 Attempt to submit cmd buf w/ deleted image
11939 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11940 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011941
Tony Barbour1fa09702017-03-16 12:09:08 -060011942 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011943 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011944 if (!depth_format) {
11945 printf(" No Depth + Stencil format found. Skipped.\n");
11946 return;
11947 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011948 // Create src & dst images to use for copy operations
11949 VkImage src_image;
11950 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011951 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011952
11953 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11954 const int32_t tex_width = 32;
11955 const int32_t tex_height = 32;
11956
11957 VkImageCreateInfo image_create_info = {};
11958 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11959 image_create_info.pNext = NULL;
11960 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11961 image_create_info.format = tex_format;
11962 image_create_info.extent.width = tex_width;
11963 image_create_info.extent.height = tex_height;
11964 image_create_info.extent.depth = 1;
11965 image_create_info.mipLevels = 1;
11966 image_create_info.arrayLayers = 4;
11967 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11968 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11969 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011970 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011971 image_create_info.flags = 0;
11972
11973 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11974 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011975 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011976 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11977 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011978 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11979 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11980 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11981 ASSERT_VK_SUCCESS(err);
11982
11983 // Allocate memory
11984 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011985 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011986 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011987 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11988 mem_alloc.pNext = NULL;
11989 mem_alloc.allocationSize = 0;
11990 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011991
11992 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011993 mem_alloc.allocationSize = img_mem_reqs.size;
11994 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011995 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011996 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011997 ASSERT_VK_SUCCESS(err);
11998
11999 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012000 mem_alloc.allocationSize = img_mem_reqs.size;
12001 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012002 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012003 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012004 ASSERT_VK_SUCCESS(err);
12005
12006 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012007 mem_alloc.allocationSize = img_mem_reqs.size;
12008 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012009 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012010 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012011 ASSERT_VK_SUCCESS(err);
12012
12013 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12014 ASSERT_VK_SUCCESS(err);
12015 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12016 ASSERT_VK_SUCCESS(err);
12017 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12018 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012019
Tony Barbour552f6c02016-12-21 14:34:07 -070012020 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012021 VkImageCopy copy_region;
12022 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12023 copy_region.srcSubresource.mipLevel = 0;
12024 copy_region.srcSubresource.baseArrayLayer = 0;
12025 copy_region.srcSubresource.layerCount = 1;
12026 copy_region.srcOffset.x = 0;
12027 copy_region.srcOffset.y = 0;
12028 copy_region.srcOffset.z = 0;
12029 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12030 copy_region.dstSubresource.mipLevel = 0;
12031 copy_region.dstSubresource.baseArrayLayer = 0;
12032 copy_region.dstSubresource.layerCount = 1;
12033 copy_region.dstOffset.x = 0;
12034 copy_region.dstOffset.y = 0;
12035 copy_region.dstOffset.z = 0;
12036 copy_region.extent.width = 1;
12037 copy_region.extent.height = 1;
12038 copy_region.extent.depth = 1;
12039
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12041 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12042 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012043
Cort530cf382016-12-08 09:59:47 -080012044 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 -060012045 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012046 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12047 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012048 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12049 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012050 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 -060012051 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012053 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12054 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012055 m_errorMonitor->SetUnexpectedError("srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080012056 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 -060012057 m_errorMonitor->VerifyFound();
12058 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012060 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012061 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012062 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012063 "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 -080012064 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 -060012065 m_errorMonitor->VerifyFound();
12066 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12068 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12069 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012070 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 -060012071 m_errorMonitor->VerifyFound();
12072 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012074 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012075 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012076 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012077 "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 -080012078 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 -060012079 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012081 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12082 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012083 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012084 "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 -080012085 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 -060012086 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012087
Cort3b021012016-12-07 12:00:57 -080012088 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12089 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12090 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12091 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12092 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12093 transfer_dst_image_barrier[0].srcAccessMask = 0;
12094 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12095 transfer_dst_image_barrier[0].image = dst_image;
12096 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12097 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12098 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12099 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12100 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12101 transfer_dst_image_barrier[0].image = depth_image;
12102 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12103 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12104 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12105
12106 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012107 VkClearColorValue color_clear_value = {};
12108 VkImageSubresourceRange clear_range;
12109 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12110 clear_range.baseMipLevel = 0;
12111 clear_range.baseArrayLayer = 0;
12112 clear_range.layerCount = 1;
12113 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012114
Cort3b021012016-12-07 12:00:57 -080012115 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12116 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012119 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012120 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012121 // Fail due to provided layout not matching actual current layout for color clear.
12122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012123 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012124 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012125
Cort530cf382016-12-08 09:59:47 -080012126 VkClearDepthStencilValue depth_clear_value = {};
12127 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012128
12129 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12130 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012133 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012134 m_errorMonitor->VerifyFound();
12135 // Fail due to provided layout not matching actual current layout for depth clear.
12136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012137 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012138 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012139
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012140 // Now cause error due to bad image layout transition in PipelineBarrier
12141 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012142 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012143 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012144 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012145 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012146 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12147 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012148 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012150 "you cannot transition the layout of aspect 1 from "
12151 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12152 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012154 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12155 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012156 m_errorMonitor->VerifyFound();
12157
12158 // Finally some layout errors at RenderPass create time
12159 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12160 VkAttachmentReference attach = {};
12161 // perf warning for GENERAL layout w/ non-DS input attachment
12162 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12163 VkSubpassDescription subpass = {};
12164 subpass.inputAttachmentCount = 1;
12165 subpass.pInputAttachments = &attach;
12166 VkRenderPassCreateInfo rpci = {};
12167 rpci.subpassCount = 1;
12168 rpci.pSubpasses = &subpass;
12169 rpci.attachmentCount = 1;
12170 VkAttachmentDescription attach_desc = {};
12171 attach_desc.format = VK_FORMAT_UNDEFINED;
12172 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012173 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012174 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12176 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012177 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12178 m_errorMonitor->VerifyFound();
12179 // error w/ non-general layout
12180 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12181
12182 m_errorMonitor->SetDesiredFailureMsg(
12183 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12184 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12185 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12186 m_errorMonitor->VerifyFound();
12187 subpass.inputAttachmentCount = 0;
12188 subpass.colorAttachmentCount = 1;
12189 subpass.pColorAttachments = &attach;
12190 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12191 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12193 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012194 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12195 m_errorMonitor->VerifyFound();
12196 // error w/ non-color opt or GENERAL layout for color attachment
12197 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12198 m_errorMonitor->SetDesiredFailureMsg(
12199 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12200 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12201 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12202 m_errorMonitor->VerifyFound();
12203 subpass.colorAttachmentCount = 0;
12204 subpass.pDepthStencilAttachment = &attach;
12205 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12206 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12208 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012209 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12210 m_errorMonitor->VerifyFound();
12211 // error w/ non-ds opt or GENERAL layout for color attachment
12212 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12214 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12215 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012216 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12217 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012218 // For this error we need a valid renderpass so create default one
12219 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12220 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012221 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012222 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12223 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12224 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12225 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12226 // Can't do a CLEAR load on READ_ONLY initialLayout
12227 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12228 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12229 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012231 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012232 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12233 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012234
Cort3b021012016-12-07 12:00:57 -080012235 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12236 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12237 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012238 vkDestroyImage(m_device->device(), src_image, NULL);
12239 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012240 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012241}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012242
Tobin Ehlise0936662016-10-11 08:10:51 -060012243TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12244 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12245 VkResult err;
12246
Tony Barbour1fa09702017-03-16 12:09:08 -060012247 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012248
12249 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12250 VkImageTiling tiling;
12251 VkFormatProperties format_properties;
12252 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12253 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12254 tiling = VK_IMAGE_TILING_LINEAR;
12255 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12256 tiling = VK_IMAGE_TILING_OPTIMAL;
12257 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012258 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012259 return;
12260 }
12261
12262 VkDescriptorPoolSize ds_type = {};
12263 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12264 ds_type.descriptorCount = 1;
12265
12266 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12267 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12268 ds_pool_ci.maxSets = 1;
12269 ds_pool_ci.poolSizeCount = 1;
12270 ds_pool_ci.pPoolSizes = &ds_type;
12271 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12272
12273 VkDescriptorPool ds_pool;
12274 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12275 ASSERT_VK_SUCCESS(err);
12276
12277 VkDescriptorSetLayoutBinding dsl_binding = {};
12278 dsl_binding.binding = 0;
12279 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12280 dsl_binding.descriptorCount = 1;
12281 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12282 dsl_binding.pImmutableSamplers = NULL;
12283
12284 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12285 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12286 ds_layout_ci.pNext = NULL;
12287 ds_layout_ci.bindingCount = 1;
12288 ds_layout_ci.pBindings = &dsl_binding;
12289
12290 VkDescriptorSetLayout ds_layout;
12291 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12292 ASSERT_VK_SUCCESS(err);
12293
12294 VkDescriptorSetAllocateInfo alloc_info = {};
12295 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12296 alloc_info.descriptorSetCount = 1;
12297 alloc_info.descriptorPool = ds_pool;
12298 alloc_info.pSetLayouts = &ds_layout;
12299 VkDescriptorSet descriptor_set;
12300 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12301 ASSERT_VK_SUCCESS(err);
12302
12303 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12304 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12305 pipeline_layout_ci.pNext = NULL;
12306 pipeline_layout_ci.setLayoutCount = 1;
12307 pipeline_layout_ci.pSetLayouts = &ds_layout;
12308 VkPipelineLayout pipeline_layout;
12309 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12310 ASSERT_VK_SUCCESS(err);
12311
12312 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012313 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012314 ASSERT_TRUE(image.initialized());
12315 VkImageView view = image.targetView(tex_format);
12316
12317 VkDescriptorImageInfo image_info = {};
12318 image_info.imageView = view;
12319 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12320
12321 VkWriteDescriptorSet descriptor_write = {};
12322 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12323 descriptor_write.dstSet = descriptor_set;
12324 descriptor_write.dstBinding = 0;
12325 descriptor_write.descriptorCount = 1;
12326 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12327 descriptor_write.pImageInfo = &image_info;
12328
12329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12330 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12331 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12332 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12333 m_errorMonitor->VerifyFound();
12334
12335 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12336 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12337 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12338 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12339}
12340
Mark Mueller93b938f2016-08-18 10:27:40 -060012341TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012342 TEST_DESCRIPTION(
12343 "Use vkCmdExecuteCommands with invalid state "
12344 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012345
Tony Barbour1fa09702017-03-16 12:09:08 -060012346 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12348
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012349 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012350 const char *simultaneous_use_message2 =
12351 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12352 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012353
12354 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012355 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012356 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012357 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12358 command_buffer_allocate_info.commandBufferCount = 1;
12359
12360 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012361 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012362 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12363 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012364 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012365 command_buffer_inheritance_info.renderPass = m_renderPass;
12366 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012367
Mark Mueller93b938f2016-08-18 10:27:40 -060012368 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012369 command_buffer_begin_info.flags =
12370 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012371 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12372
12373 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12374 vkEndCommandBuffer(secondary_command_buffer);
12375
Mark Mueller93b938f2016-08-18 10:27:40 -060012376 VkSubmitInfo submit_info = {};
12377 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12378 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012379 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012380
Mark Mueller4042b652016-09-05 22:52:21 -060012381 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012382 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12384 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012385 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012386 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012387 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12388 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012389
Dave Houltonfbf52152017-01-06 12:55:29 -070012390 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012391 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012392 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012393
Mark Mueller4042b652016-09-05 22:52:21 -060012394 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012395 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012396 m_errorMonitor->SetUnexpectedError(
12397 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12398 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012399 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012400 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012401
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12403 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012404 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012405 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12406 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012407
12408 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012409
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012410 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012411}
12412
Tony Barbour626994c2017-02-08 15:29:37 -070012413TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12414 TEST_DESCRIPTION(
12415 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12416 "errors");
12417 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12418 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 -060012419 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012420
12421 VkCommandBuffer cmd_bufs[2];
12422 VkCommandBufferAllocateInfo alloc_info;
12423 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12424 alloc_info.pNext = NULL;
12425 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012426 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012427 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12428 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12429
12430 VkCommandBufferBeginInfo cb_binfo;
12431 cb_binfo.pNext = NULL;
12432 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12433 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12434 cb_binfo.flags = 0;
12435 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12436 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12437 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12438 vkEndCommandBuffer(cmd_bufs[0]);
12439 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12440
12441 VkSubmitInfo submit_info = {};
12442 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12443 submit_info.commandBufferCount = 2;
12444 submit_info.pCommandBuffers = duplicates;
12445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12446 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12447 m_errorMonitor->VerifyFound();
12448 vkQueueWaitIdle(m_device->m_queue);
12449
12450 // Set one time use and now look for one time submit
12451 duplicates[0] = duplicates[1] = cmd_bufs[1];
12452 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12453 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12454 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12455 vkEndCommandBuffer(cmd_bufs[1]);
12456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12457 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12458 m_errorMonitor->VerifyFound();
12459 vkQueueWaitIdle(m_device->m_queue);
12460}
12461
Tobin Ehlisb093da82017-01-19 12:05:27 -070012462TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012463 TEST_DESCRIPTION(
12464 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12465 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012466
Tony Barbour1fa09702017-03-16 12:09:08 -060012467 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012468 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12469
12470 std::vector<const char *> device_extension_names;
12471 auto features = m_device->phy().features();
12472 // Make sure gs & ts are disabled
12473 features.geometryShader = false;
12474 features.tessellationShader = false;
12475 // The sacrificial device object
12476 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12477
12478 VkCommandPoolCreateInfo pool_create_info{};
12479 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12480 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12481
12482 VkCommandPool command_pool;
12483 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12484
12485 VkCommandBufferAllocateInfo cmd = {};
12486 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12487 cmd.pNext = NULL;
12488 cmd.commandPool = command_pool;
12489 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12490 cmd.commandBufferCount = 1;
12491
12492 VkCommandBuffer cmd_buffer;
12493 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12494 ASSERT_VK_SUCCESS(err);
12495
12496 VkEvent event;
12497 VkEventCreateInfo evci = {};
12498 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12499 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12500 ASSERT_VK_SUCCESS(result);
12501
12502 VkCommandBufferBeginInfo cbbi = {};
12503 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12504 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12506 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12507 m_errorMonitor->VerifyFound();
12508
12509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12510 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12511 m_errorMonitor->VerifyFound();
12512
12513 vkDestroyEvent(test_device.handle(), event, NULL);
12514 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12515}
12516
Chris Forbesd70103a2017-04-13 11:34:09 -070012517TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060012518 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012519 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12520
Tony Barbour552f6c02016-12-21 14:34:07 -070012521 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012522
12523 VkEvent event;
12524 VkEventCreateInfo event_create_info = {};
12525 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12526 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012527 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012528
Tony Barbour552f6c02016-12-21 14:34:07 -070012529 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012530 vkDestroyEvent(m_device->device(), event, nullptr);
12531
12532 VkSubmitInfo submit_info = {};
12533 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12534 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012535 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012537 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12538 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070012539}
Mark Muellerc8d441e2016-08-23 17:36:00 -060012540
Chris Forbesd70103a2017-04-13 11:34:09 -070012541TEST_F(VkLayerTest, InUseDestroyedSignaled) {
12542 TEST_DESCRIPTION(
12543 "Use vkCmdExecuteCommands with invalid state "
12544 "in primary and secondary command buffers. "
12545 "Delete objects that are inuse. Call VkQueueSubmit "
12546 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012547
Chris Forbesd70103a2017-04-13 11:34:09 -070012548 ASSERT_NO_FATAL_FAILURE(Init());
12549 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12550
12551 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012552
Mark Mueller917f6bc2016-08-30 10:57:19 -060012553 VkSemaphoreCreateInfo semaphore_create_info = {};
12554 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12555 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012556 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012557 VkFenceCreateInfo fence_create_info = {};
12558 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12559 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012560 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012561
12562 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012563 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012564 descriptor_pool_type_count.descriptorCount = 1;
12565
12566 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12567 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12568 descriptor_pool_create_info.maxSets = 1;
12569 descriptor_pool_create_info.poolSizeCount = 1;
12570 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012571 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012572
12573 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012574 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012575
12576 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012577 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012578 descriptorset_layout_binding.descriptorCount = 1;
12579 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12580
12581 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012582 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012583 descriptorset_layout_create_info.bindingCount = 1;
12584 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12585
12586 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012587 ASSERT_VK_SUCCESS(
12588 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012589
12590 VkDescriptorSet descriptorset;
12591 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012592 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012593 descriptorset_allocate_info.descriptorSetCount = 1;
12594 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12595 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012596 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012597
Mark Mueller4042b652016-09-05 22:52:21 -060012598 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12599
12600 VkDescriptorBufferInfo buffer_info = {};
12601 buffer_info.buffer = buffer_test.GetBuffer();
12602 buffer_info.offset = 0;
12603 buffer_info.range = 1024;
12604
12605 VkWriteDescriptorSet write_descriptor_set = {};
12606 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12607 write_descriptor_set.dstSet = descriptorset;
12608 write_descriptor_set.descriptorCount = 1;
12609 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12610 write_descriptor_set.pBufferInfo = &buffer_info;
12611
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012612 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012613
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012614 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12615 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012616
12617 VkPipelineObj pipe(m_device);
12618 pipe.AddColorAttachment();
12619 pipe.AddShader(&vs);
12620 pipe.AddShader(&fs);
12621
12622 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012623 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012624 pipeline_layout_create_info.setLayoutCount = 1;
12625 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12626
12627 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012628 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012629
12630 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12631
Chris Forbesd70103a2017-04-13 11:34:09 -070012632 VkEvent event;
12633 VkEventCreateInfo event_create_info = {};
12634 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12635 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12636
Tony Barbour552f6c02016-12-21 14:34:07 -070012637 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070012638
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012639 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012640
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012641 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12642 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12643 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012644
Tony Barbour552f6c02016-12-21 14:34:07 -070012645 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012646
Chris Forbesd70103a2017-04-13 11:34:09 -070012647 VkSubmitInfo submit_info = {};
12648 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12649 submit_info.commandBufferCount = 1;
12650 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012651 submit_info.signalSemaphoreCount = 1;
12652 submit_info.pSignalSemaphores = &semaphore;
12653 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012654 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012655
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012657 vkDestroyEvent(m_device->device(), event, nullptr);
12658 m_errorMonitor->VerifyFound();
12659
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012661 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12662 m_errorMonitor->VerifyFound();
12663
Jeremy Hayes08369882017-02-02 10:31:06 -070012664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012665 vkDestroyFence(m_device->device(), fence, nullptr);
12666 m_errorMonitor->VerifyFound();
12667
Tobin Ehlis122207b2016-09-01 08:50:06 -070012668 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012669 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12670 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012671 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012672 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12673 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012674 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012675 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12676 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012677 vkDestroyEvent(m_device->device(), event, nullptr);
12678 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012679 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012680 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12681}
12682
Tobin Ehlis2adda372016-09-01 08:51:06 -070012683TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12684 TEST_DESCRIPTION("Delete in-use query pool.");
12685
Tony Barbour1fa09702017-03-16 12:09:08 -060012686 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012687 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12688
12689 VkQueryPool query_pool;
12690 VkQueryPoolCreateInfo query_pool_ci{};
12691 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12692 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12693 query_pool_ci.queryCount = 1;
12694 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012695 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012696 // Reset query pool to create binding with cmd buffer
12697 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12698
Tony Barbour552f6c02016-12-21 14:34:07 -070012699 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012700
12701 VkSubmitInfo submit_info = {};
12702 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12703 submit_info.commandBufferCount = 1;
12704 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12705 // Submit cmd buffer and then destroy query pool while in-flight
12706 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12707
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012709 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12710 m_errorMonitor->VerifyFound();
12711
12712 vkQueueWaitIdle(m_device->m_queue);
12713 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012714 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012715 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012716 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12717}
12718
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012719TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12720 TEST_DESCRIPTION("Delete in-use pipeline.");
12721
Tony Barbour1fa09702017-03-16 12:09:08 -060012722 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012723 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12724
12725 // Empty pipeline layout used for binding PSO
12726 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12727 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12728 pipeline_layout_ci.setLayoutCount = 0;
12729 pipeline_layout_ci.pSetLayouts = NULL;
12730
12731 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012732 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012733 ASSERT_VK_SUCCESS(err);
12734
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012736 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012737 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12738 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012739 // Store pipeline handle so we can actually delete it before test finishes
12740 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012741 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012742 VkPipelineObj pipe(m_device);
12743 pipe.AddShader(&vs);
12744 pipe.AddShader(&fs);
12745 pipe.AddColorAttachment();
12746 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12747 delete_this_pipeline = pipe.handle();
12748
Tony Barbour552f6c02016-12-21 14:34:07 -070012749 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012750 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012751 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012752
Tony Barbour552f6c02016-12-21 14:34:07 -070012753 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012754
12755 VkSubmitInfo submit_info = {};
12756 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12757 submit_info.commandBufferCount = 1;
12758 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12759 // Submit cmd buffer and then pipeline destroyed while in-flight
12760 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012761 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012762 m_errorMonitor->VerifyFound();
12763 // Make sure queue finished and then actually delete pipeline
12764 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012765 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12766 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012767 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12768 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12769}
12770
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012771TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12772 TEST_DESCRIPTION("Delete in-use imageView.");
12773
Tony Barbour1fa09702017-03-16 12:09:08 -060012774 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012775 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12776
12777 VkDescriptorPoolSize ds_type_count;
12778 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12779 ds_type_count.descriptorCount = 1;
12780
12781 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12782 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12783 ds_pool_ci.maxSets = 1;
12784 ds_pool_ci.poolSizeCount = 1;
12785 ds_pool_ci.pPoolSizes = &ds_type_count;
12786
12787 VkDescriptorPool ds_pool;
12788 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12789 ASSERT_VK_SUCCESS(err);
12790
12791 VkSamplerCreateInfo sampler_ci = {};
12792 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12793 sampler_ci.pNext = NULL;
12794 sampler_ci.magFilter = VK_FILTER_NEAREST;
12795 sampler_ci.minFilter = VK_FILTER_NEAREST;
12796 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12797 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12798 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12799 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12800 sampler_ci.mipLodBias = 1.0;
12801 sampler_ci.anisotropyEnable = VK_FALSE;
12802 sampler_ci.maxAnisotropy = 1;
12803 sampler_ci.compareEnable = VK_FALSE;
12804 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12805 sampler_ci.minLod = 1.0;
12806 sampler_ci.maxLod = 1.0;
12807 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12808 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12809 VkSampler sampler;
12810
12811 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12812 ASSERT_VK_SUCCESS(err);
12813
12814 VkDescriptorSetLayoutBinding layout_binding;
12815 layout_binding.binding = 0;
12816 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12817 layout_binding.descriptorCount = 1;
12818 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12819 layout_binding.pImmutableSamplers = NULL;
12820
12821 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12822 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12823 ds_layout_ci.bindingCount = 1;
12824 ds_layout_ci.pBindings = &layout_binding;
12825 VkDescriptorSetLayout ds_layout;
12826 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12827 ASSERT_VK_SUCCESS(err);
12828
12829 VkDescriptorSetAllocateInfo alloc_info = {};
12830 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12831 alloc_info.descriptorSetCount = 1;
12832 alloc_info.descriptorPool = ds_pool;
12833 alloc_info.pSetLayouts = &ds_layout;
12834 VkDescriptorSet descriptor_set;
12835 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12836 ASSERT_VK_SUCCESS(err);
12837
12838 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12839 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12840 pipeline_layout_ci.pNext = NULL;
12841 pipeline_layout_ci.setLayoutCount = 1;
12842 pipeline_layout_ci.pSetLayouts = &ds_layout;
12843
12844 VkPipelineLayout pipeline_layout;
12845 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12846 ASSERT_VK_SUCCESS(err);
12847
12848 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012849 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 -060012850 ASSERT_TRUE(image.initialized());
12851
12852 VkImageView view;
12853 VkImageViewCreateInfo ivci = {};
12854 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12855 ivci.image = image.handle();
12856 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12857 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12858 ivci.subresourceRange.layerCount = 1;
12859 ivci.subresourceRange.baseMipLevel = 0;
12860 ivci.subresourceRange.levelCount = 1;
12861 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12862
12863 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12864 ASSERT_VK_SUCCESS(err);
12865
12866 VkDescriptorImageInfo image_info{};
12867 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12868 image_info.imageView = view;
12869 image_info.sampler = sampler;
12870
12871 VkWriteDescriptorSet descriptor_write = {};
12872 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12873 descriptor_write.dstSet = descriptor_set;
12874 descriptor_write.dstBinding = 0;
12875 descriptor_write.descriptorCount = 1;
12876 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12877 descriptor_write.pImageInfo = &image_info;
12878
12879 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12880
12881 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012882 char const *vsSource =
12883 "#version 450\n"
12884 "\n"
12885 "out gl_PerVertex { \n"
12886 " vec4 gl_Position;\n"
12887 "};\n"
12888 "void main(){\n"
12889 " gl_Position = vec4(1);\n"
12890 "}\n";
12891 char const *fsSource =
12892 "#version 450\n"
12893 "\n"
12894 "layout(set=0, binding=0) uniform sampler2D s;\n"
12895 "layout(location=0) out vec4 x;\n"
12896 "void main(){\n"
12897 " x = texture(s, vec2(1));\n"
12898 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012899 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12900 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12901 VkPipelineObj pipe(m_device);
12902 pipe.AddShader(&vs);
12903 pipe.AddShader(&fs);
12904 pipe.AddColorAttachment();
12905 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12906
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012908
Tony Barbour552f6c02016-12-21 14:34:07 -070012909 m_commandBuffer->BeginCommandBuffer();
12910 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012911 // Bind pipeline to cmd buffer
12912 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12913 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12914 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012915
12916 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12917 VkRect2D scissor = {{0, 0}, {16, 16}};
12918 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12919 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12920
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012921 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012922 m_commandBuffer->EndRenderPass();
12923 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012924 // Submit cmd buffer then destroy sampler
12925 VkSubmitInfo submit_info = {};
12926 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12927 submit_info.commandBufferCount = 1;
12928 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12929 // Submit cmd buffer and then destroy imageView while in-flight
12930 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12931
12932 vkDestroyImageView(m_device->device(), view, nullptr);
12933 m_errorMonitor->VerifyFound();
12934 vkQueueWaitIdle(m_device->m_queue);
12935 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012936 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012937 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012938 vkDestroyImageView(m_device->device(), view, NULL);
12939 vkDestroySampler(m_device->device(), sampler, nullptr);
12940 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12941 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12942 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12943}
12944
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012945TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12946 TEST_DESCRIPTION("Delete in-use bufferView.");
12947
Tony Barbour1fa09702017-03-16 12:09:08 -060012948 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012949 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12950
12951 VkDescriptorPoolSize ds_type_count;
12952 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12953 ds_type_count.descriptorCount = 1;
12954
12955 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12956 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12957 ds_pool_ci.maxSets = 1;
12958 ds_pool_ci.poolSizeCount = 1;
12959 ds_pool_ci.pPoolSizes = &ds_type_count;
12960
12961 VkDescriptorPool ds_pool;
12962 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12963 ASSERT_VK_SUCCESS(err);
12964
12965 VkDescriptorSetLayoutBinding layout_binding;
12966 layout_binding.binding = 0;
12967 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12968 layout_binding.descriptorCount = 1;
12969 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12970 layout_binding.pImmutableSamplers = NULL;
12971
12972 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12973 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12974 ds_layout_ci.bindingCount = 1;
12975 ds_layout_ci.pBindings = &layout_binding;
12976 VkDescriptorSetLayout ds_layout;
12977 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12978 ASSERT_VK_SUCCESS(err);
12979
12980 VkDescriptorSetAllocateInfo alloc_info = {};
12981 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12982 alloc_info.descriptorSetCount = 1;
12983 alloc_info.descriptorPool = ds_pool;
12984 alloc_info.pSetLayouts = &ds_layout;
12985 VkDescriptorSet descriptor_set;
12986 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12987 ASSERT_VK_SUCCESS(err);
12988
12989 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12990 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12991 pipeline_layout_ci.pNext = NULL;
12992 pipeline_layout_ci.setLayoutCount = 1;
12993 pipeline_layout_ci.pSetLayouts = &ds_layout;
12994
12995 VkPipelineLayout pipeline_layout;
12996 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12997 ASSERT_VK_SUCCESS(err);
12998
12999 VkBuffer buffer;
13000 uint32_t queue_family_index = 0;
13001 VkBufferCreateInfo buffer_create_info = {};
13002 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
13003 buffer_create_info.size = 1024;
13004 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13005 buffer_create_info.queueFamilyIndexCount = 1;
13006 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13007
13008 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13009 ASSERT_VK_SUCCESS(err);
13010
13011 VkMemoryRequirements memory_reqs;
13012 VkDeviceMemory buffer_memory;
13013
13014 VkMemoryAllocateInfo memory_info = {};
13015 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13016 memory_info.allocationSize = 0;
13017 memory_info.memoryTypeIndex = 0;
13018
13019 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13020 memory_info.allocationSize = memory_reqs.size;
13021 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13022 ASSERT_TRUE(pass);
13023
13024 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13025 ASSERT_VK_SUCCESS(err);
13026 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13027 ASSERT_VK_SUCCESS(err);
13028
13029 VkBufferView view;
13030 VkBufferViewCreateInfo bvci = {};
13031 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13032 bvci.buffer = buffer;
13033 bvci.format = VK_FORMAT_R8_UNORM;
13034 bvci.range = VK_WHOLE_SIZE;
13035
13036 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13037 ASSERT_VK_SUCCESS(err);
13038
13039 VkWriteDescriptorSet descriptor_write = {};
13040 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13041 descriptor_write.dstSet = descriptor_set;
13042 descriptor_write.dstBinding = 0;
13043 descriptor_write.descriptorCount = 1;
13044 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13045 descriptor_write.pTexelBufferView = &view;
13046
13047 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13048
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013049 char const *vsSource =
13050 "#version 450\n"
13051 "\n"
13052 "out gl_PerVertex { \n"
13053 " vec4 gl_Position;\n"
13054 "};\n"
13055 "void main(){\n"
13056 " gl_Position = vec4(1);\n"
13057 "}\n";
13058 char const *fsSource =
13059 "#version 450\n"
13060 "\n"
13061 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13062 "layout(location=0) out vec4 x;\n"
13063 "void main(){\n"
13064 " x = imageLoad(s, 0);\n"
13065 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013066 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13067 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13068 VkPipelineObj pipe(m_device);
13069 pipe.AddShader(&vs);
13070 pipe.AddShader(&fs);
13071 pipe.AddColorAttachment();
13072 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13073
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013075
Tony Barbour552f6c02016-12-21 14:34:07 -070013076 m_commandBuffer->BeginCommandBuffer();
13077 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013078 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13079 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13080 VkRect2D scissor = {{0, 0}, {16, 16}};
13081 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13082 // Bind pipeline to cmd buffer
13083 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13084 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13085 &descriptor_set, 0, nullptr);
13086 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013087 m_commandBuffer->EndRenderPass();
13088 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013089
13090 VkSubmitInfo submit_info = {};
13091 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13092 submit_info.commandBufferCount = 1;
13093 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13094 // Submit cmd buffer and then destroy bufferView while in-flight
13095 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13096
13097 vkDestroyBufferView(m_device->device(), view, nullptr);
13098 m_errorMonitor->VerifyFound();
13099 vkQueueWaitIdle(m_device->m_queue);
13100 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013101 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013102 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013103 vkDestroyBufferView(m_device->device(), view, NULL);
13104 vkDestroyBuffer(m_device->device(), buffer, NULL);
13105 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13106 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13107 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13108 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13109}
13110
Tobin Ehlis209532e2016-09-07 13:52:18 -060013111TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13112 TEST_DESCRIPTION("Delete in-use sampler.");
13113
Tony Barbour1fa09702017-03-16 12:09:08 -060013114 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013115 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13116
13117 VkDescriptorPoolSize ds_type_count;
13118 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13119 ds_type_count.descriptorCount = 1;
13120
13121 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13122 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13123 ds_pool_ci.maxSets = 1;
13124 ds_pool_ci.poolSizeCount = 1;
13125 ds_pool_ci.pPoolSizes = &ds_type_count;
13126
13127 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013128 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013129 ASSERT_VK_SUCCESS(err);
13130
13131 VkSamplerCreateInfo sampler_ci = {};
13132 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13133 sampler_ci.pNext = NULL;
13134 sampler_ci.magFilter = VK_FILTER_NEAREST;
13135 sampler_ci.minFilter = VK_FILTER_NEAREST;
13136 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13137 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13138 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13139 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13140 sampler_ci.mipLodBias = 1.0;
13141 sampler_ci.anisotropyEnable = VK_FALSE;
13142 sampler_ci.maxAnisotropy = 1;
13143 sampler_ci.compareEnable = VK_FALSE;
13144 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13145 sampler_ci.minLod = 1.0;
13146 sampler_ci.maxLod = 1.0;
13147 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13148 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13149 VkSampler sampler;
13150
13151 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13152 ASSERT_VK_SUCCESS(err);
13153
13154 VkDescriptorSetLayoutBinding layout_binding;
13155 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013156 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013157 layout_binding.descriptorCount = 1;
13158 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13159 layout_binding.pImmutableSamplers = NULL;
13160
13161 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13162 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13163 ds_layout_ci.bindingCount = 1;
13164 ds_layout_ci.pBindings = &layout_binding;
13165 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013166 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013167 ASSERT_VK_SUCCESS(err);
13168
13169 VkDescriptorSetAllocateInfo alloc_info = {};
13170 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13171 alloc_info.descriptorSetCount = 1;
13172 alloc_info.descriptorPool = ds_pool;
13173 alloc_info.pSetLayouts = &ds_layout;
13174 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013175 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013176 ASSERT_VK_SUCCESS(err);
13177
13178 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13179 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13180 pipeline_layout_ci.pNext = NULL;
13181 pipeline_layout_ci.setLayoutCount = 1;
13182 pipeline_layout_ci.pSetLayouts = &ds_layout;
13183
13184 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013185 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013186 ASSERT_VK_SUCCESS(err);
13187
13188 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013189 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 -060013190 ASSERT_TRUE(image.initialized());
13191
13192 VkImageView view;
13193 VkImageViewCreateInfo ivci = {};
13194 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13195 ivci.image = image.handle();
13196 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13197 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13198 ivci.subresourceRange.layerCount = 1;
13199 ivci.subresourceRange.baseMipLevel = 0;
13200 ivci.subresourceRange.levelCount = 1;
13201 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13202
13203 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13204 ASSERT_VK_SUCCESS(err);
13205
13206 VkDescriptorImageInfo image_info{};
13207 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13208 image_info.imageView = view;
13209 image_info.sampler = sampler;
13210
13211 VkWriteDescriptorSet descriptor_write = {};
13212 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13213 descriptor_write.dstSet = descriptor_set;
13214 descriptor_write.dstBinding = 0;
13215 descriptor_write.descriptorCount = 1;
13216 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13217 descriptor_write.pImageInfo = &image_info;
13218
13219 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13220
13221 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013222 char const *vsSource =
13223 "#version 450\n"
13224 "\n"
13225 "out gl_PerVertex { \n"
13226 " vec4 gl_Position;\n"
13227 "};\n"
13228 "void main(){\n"
13229 " gl_Position = vec4(1);\n"
13230 "}\n";
13231 char const *fsSource =
13232 "#version 450\n"
13233 "\n"
13234 "layout(set=0, binding=0) uniform sampler2D s;\n"
13235 "layout(location=0) out vec4 x;\n"
13236 "void main(){\n"
13237 " x = texture(s, vec2(1));\n"
13238 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013239 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13240 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13241 VkPipelineObj pipe(m_device);
13242 pipe.AddShader(&vs);
13243 pipe.AddShader(&fs);
13244 pipe.AddColorAttachment();
13245 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13246
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013248
Tony Barbour552f6c02016-12-21 14:34:07 -070013249 m_commandBuffer->BeginCommandBuffer();
13250 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013251 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013252 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13253 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13254 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013255
13256 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13257 VkRect2D scissor = {{0, 0}, {16, 16}};
13258 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13259 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13260
Tobin Ehlis209532e2016-09-07 13:52:18 -060013261 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013262 m_commandBuffer->EndRenderPass();
13263 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013264 // Submit cmd buffer then destroy sampler
13265 VkSubmitInfo submit_info = {};
13266 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13267 submit_info.commandBufferCount = 1;
13268 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13269 // Submit cmd buffer and then destroy sampler while in-flight
13270 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13271
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013272 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013273 m_errorMonitor->VerifyFound();
13274 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013275
Tobin Ehlis209532e2016-09-07 13:52:18 -060013276 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013277 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13278 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013279 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013280 vkDestroyImageView(m_device->device(), view, NULL);
13281 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13282 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13283 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13284}
13285
Mark Mueller1cd9f412016-08-25 13:23:52 -060013286TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013287 TEST_DESCRIPTION(
13288 "Call VkQueueSubmit with a semaphore that is already "
13289 "signaled but not waited on by the queue. Wait on a "
13290 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013291
Tony Barbour1fa09702017-03-16 12:09:08 -060013292 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013293 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13294
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013295 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 -070013296 const char *invalid_fence_wait_message =
13297 " which has not been submitted on a Queue or during "
13298 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013299
Tony Barbour552f6c02016-12-21 14:34:07 -070013300 m_commandBuffer->BeginCommandBuffer();
13301 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013302
13303 VkSemaphoreCreateInfo semaphore_create_info = {};
13304 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13305 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013306 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013307 VkSubmitInfo submit_info = {};
13308 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13309 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013310 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013311 submit_info.signalSemaphoreCount = 1;
13312 submit_info.pSignalSemaphores = &semaphore;
13313 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013314 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013315 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013316 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013317 m_commandBuffer->BeginCommandBuffer();
13318 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013320 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13321 m_errorMonitor->VerifyFound();
13322
Mark Mueller1cd9f412016-08-25 13:23:52 -060013323 VkFenceCreateInfo fence_create_info = {};
13324 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13325 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013326 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013327
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013329 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13330 m_errorMonitor->VerifyFound();
13331
Mark Mueller4042b652016-09-05 22:52:21 -060013332 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013333 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013334 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13335}
13336
Tobin Ehlis4af23302016-07-19 10:50:30 -060013337TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013338 TEST_DESCRIPTION(
13339 "Bind a secondary command buffer with with a framebuffer "
13340 "that does not match the framebuffer for the active "
13341 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013342 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013343 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13344
13345 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013346 VkAttachmentDescription attachment = {0,
13347 VK_FORMAT_B8G8R8A8_UNORM,
13348 VK_SAMPLE_COUNT_1_BIT,
13349 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13350 VK_ATTACHMENT_STORE_OP_STORE,
13351 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13352 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13353 VK_IMAGE_LAYOUT_UNDEFINED,
13354 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013355
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013356 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013357
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013358 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013359
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013360 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013361
13362 VkRenderPass rp;
13363 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13364 ASSERT_VK_SUCCESS(err);
13365
13366 // A compatible framebuffer.
13367 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013368 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 -060013369 ASSERT_TRUE(image.initialized());
13370
13371 VkImageViewCreateInfo ivci = {
13372 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13373 nullptr,
13374 0,
13375 image.handle(),
13376 VK_IMAGE_VIEW_TYPE_2D,
13377 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013378 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13379 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013380 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13381 };
13382 VkImageView view;
13383 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13384 ASSERT_VK_SUCCESS(err);
13385
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013386 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013387 VkFramebuffer fb;
13388 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13389 ASSERT_VK_SUCCESS(err);
13390
13391 VkCommandBufferAllocateInfo cbai = {};
13392 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013393 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013394 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13395 cbai.commandBufferCount = 1;
13396
13397 VkCommandBuffer sec_cb;
13398 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13399 ASSERT_VK_SUCCESS(err);
13400 VkCommandBufferBeginInfo cbbi = {};
13401 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013402 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013403 cbii.renderPass = renderPass();
13404 cbii.framebuffer = fb;
13405 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13406 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013407 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 -060013408 cbbi.pInheritanceInfo = &cbii;
13409 vkBeginCommandBuffer(sec_cb, &cbbi);
13410 vkEndCommandBuffer(sec_cb);
13411
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013412 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013413 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13414 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013415
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013417 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013418 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13419 m_errorMonitor->VerifyFound();
13420 // Cleanup
13421 vkDestroyImageView(m_device->device(), view, NULL);
13422 vkDestroyRenderPass(m_device->device(), rp, NULL);
13423 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13424}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013425
13426TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013427 TEST_DESCRIPTION(
13428 "If logicOp is available on the device, set it to an "
13429 "invalid value. If logicOp is not available, attempt to "
13430 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013431 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013432 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13433
13434 auto features = m_device->phy().features();
13435 // Set the expected error depending on whether or not logicOp available
13436 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13438 "If logic operations feature not "
13439 "enabled, logicOpEnable must be "
13440 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013441 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013443 }
13444 // Create a pipeline using logicOp
13445 VkResult err;
13446
13447 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13448 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13449
13450 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013451 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013452 ASSERT_VK_SUCCESS(err);
13453
13454 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13455 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13456 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013457 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013458 vp_state_ci.pViewports = &vp;
13459 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013460 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013461 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013462
13463 VkPipelineShaderStageCreateInfo shaderStages[2];
13464 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13465
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013466 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13467 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013468 shaderStages[0] = vs.GetStageCreateInfo();
13469 shaderStages[1] = fs.GetStageCreateInfo();
13470
13471 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13472 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13473
13474 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13475 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13476 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13477
13478 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13479 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013480 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013481
13482 VkPipelineColorBlendAttachmentState att = {};
13483 att.blendEnable = VK_FALSE;
13484 att.colorWriteMask = 0xf;
13485
13486 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13487 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13488 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13489 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013490 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013491 cb_ci.attachmentCount = 1;
13492 cb_ci.pAttachments = &att;
13493
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013494 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13495 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13496 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13497
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013498 VkGraphicsPipelineCreateInfo gp_ci = {};
13499 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13500 gp_ci.stageCount = 2;
13501 gp_ci.pStages = shaderStages;
13502 gp_ci.pVertexInputState = &vi_ci;
13503 gp_ci.pInputAssemblyState = &ia_ci;
13504 gp_ci.pViewportState = &vp_state_ci;
13505 gp_ci.pRasterizationState = &rs_ci;
13506 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013507 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013508 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13509 gp_ci.layout = pipeline_layout;
13510 gp_ci.renderPass = renderPass();
13511
13512 VkPipelineCacheCreateInfo pc_ci = {};
13513 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13514
13515 VkPipeline pipeline;
13516 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013517 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013518 ASSERT_VK_SUCCESS(err);
13519
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013520 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013521 m_errorMonitor->VerifyFound();
13522 if (VK_SUCCESS == err) {
13523 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13524 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013525 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13526 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13527}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013528
Mike Stroyanaccf7692015-05-12 16:00:45 -060013529#if GTEST_IS_THREADSAFE
13530struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013531 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013532 VkEvent event;
13533 bool bailout;
13534};
13535
Karl Schultz6addd812016-02-02 17:17:23 -070013536extern "C" void *AddToCommandBuffer(void *arg) {
13537 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013538
Mike Stroyana6d14942016-07-13 15:10:05 -060013539 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013540 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013541 if (data->bailout) {
13542 break;
13543 }
13544 }
13545 return NULL;
13546}
13547
Karl Schultz6addd812016-02-02 17:17:23 -070013548TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013549 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013550
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013552
Tony Barbour1fa09702017-03-16 12:09:08 -060013553 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013554 ASSERT_NO_FATAL_FAILURE(InitViewport());
13555 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13556
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013557 // Calls AllocateCommandBuffers
13558 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013559
13560 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013561 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013562
13563 VkEventCreateInfo event_info;
13564 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013565 VkResult err;
13566
13567 memset(&event_info, 0, sizeof(event_info));
13568 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13569
Chia-I Wuf7458c52015-10-26 21:10:41 +080013570 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013571 ASSERT_VK_SUCCESS(err);
13572
Mike Stroyanaccf7692015-05-12 16:00:45 -060013573 err = vkResetEvent(device(), event);
13574 ASSERT_VK_SUCCESS(err);
13575
13576 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013577 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013578 data.event = event;
13579 data.bailout = false;
13580 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013581
13582 // First do some correct operations using multiple threads.
13583 // Add many entries to command buffer from another thread.
13584 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13585 // Make non-conflicting calls from this thread at the same time.
13586 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013587 uint32_t count;
13588 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013589 }
13590 test_platform_thread_join(thread, NULL);
13591
13592 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013593 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013594 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013595 // Add many entries to command buffer from this thread at the same time.
13596 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013597
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013598 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013599 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013600
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013601 m_errorMonitor->SetBailout(NULL);
13602
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013603 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013604
Chia-I Wuf7458c52015-10-26 21:10:41 +080013605 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013606}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013607#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013608
Karl Schultz6addd812016-02-02 17:17:23 -070013609TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013610 TEST_DESCRIPTION(
13611 "Test that an error is produced for a spirv module "
13612 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013613
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013615
Tony Barbour1fa09702017-03-16 12:09:08 -060013616 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013617 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13618
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013619 VkShaderModule module;
13620 VkShaderModuleCreateInfo moduleCreateInfo;
13621 struct icd_spv_header spv;
13622
13623 spv.magic = ICD_SPV_MAGIC;
13624 spv.version = ICD_SPV_VERSION;
13625 spv.gen_magic = 0;
13626
13627 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13628 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013629 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013630 moduleCreateInfo.codeSize = 4;
13631 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013632 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013633
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013634 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013635}
13636
Karl Schultz6addd812016-02-02 17:17:23 -070013637TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013638 TEST_DESCRIPTION(
13639 "Test that an error is produced for a spirv module "
13640 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013641
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013643
Tony Barbour1fa09702017-03-16 12:09:08 -060013644 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013645 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13646
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013647 VkShaderModule module;
13648 VkShaderModuleCreateInfo moduleCreateInfo;
13649 struct icd_spv_header spv;
13650
13651 spv.magic = ~ICD_SPV_MAGIC;
13652 spv.version = ICD_SPV_VERSION;
13653 spv.gen_magic = 0;
13654
13655 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13656 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013657 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013658 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13659 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013660 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013661
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013662 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013663}
13664
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013665#if 0
13666// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013667TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013669 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013670
Tony Barbour1fa09702017-03-16 12:09:08 -060013671 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013672 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13673
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013674 VkShaderModule module;
13675 VkShaderModuleCreateInfo moduleCreateInfo;
13676 struct icd_spv_header spv;
13677
13678 spv.magic = ICD_SPV_MAGIC;
13679 spv.version = ~ICD_SPV_VERSION;
13680 spv.gen_magic = 0;
13681
13682 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13683 moduleCreateInfo.pNext = NULL;
13684
Karl Schultz6addd812016-02-02 17:17:23 -070013685 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013686 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13687 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013688 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013689
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013690 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013691}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013692#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013693
Karl Schultz6addd812016-02-02 17:17:23 -070013694TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013695 TEST_DESCRIPTION(
13696 "Test that a warning is produced for a vertex output that "
13697 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013699
Tony Barbour1fa09702017-03-16 12:09:08 -060013700 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013701 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013702
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013703 char const *vsSource =
13704 "#version 450\n"
13705 "\n"
13706 "layout(location=0) out float x;\n"
13707 "out gl_PerVertex {\n"
13708 " vec4 gl_Position;\n"
13709 "};\n"
13710 "void main(){\n"
13711 " gl_Position = vec4(1);\n"
13712 " x = 0;\n"
13713 "}\n";
13714 char const *fsSource =
13715 "#version 450\n"
13716 "\n"
13717 "layout(location=0) out vec4 color;\n"
13718 "void main(){\n"
13719 " color = vec4(1);\n"
13720 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013721
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013722 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13723 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013724
13725 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013726 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013727 pipe.AddShader(&vs);
13728 pipe.AddShader(&fs);
13729
Chris Forbes9f7ff632015-05-25 11:13:08 +120013730 VkDescriptorSetObj descriptorSet(m_device);
13731 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013732 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013733
Tony Barbour5781e8f2015-08-04 16:23:11 -060013734 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013735
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013736 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013737}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013738
Mark Mueller098c9cb2016-09-08 09:01:57 -060013739TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13740 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13741
Tony Barbour1fa09702017-03-16 12:09:08 -060013742 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013743 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13744
13745 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013746 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013747
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013748 char const *vsSource =
13749 "#version 450\n"
13750 "\n"
13751 "out gl_PerVertex {\n"
13752 " vec4 gl_Position;\n"
13753 "};\n"
13754 "void main(){\n"
13755 " gl_Position = vec4(1);\n"
13756 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013757
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013758 char const *fsSource =
13759 "#version 450\n"
13760 "\n"
13761 "layout (constant_id = 0) const float r = 0.0f;\n"
13762 "layout(location = 0) out vec4 uFragColor;\n"
13763 "void main(){\n"
13764 " uFragColor = vec4(r,1,0,1);\n"
13765 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013766
13767 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13768 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13769
13770 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13771 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13772
13773 VkPipelineLayout pipeline_layout;
13774 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13775
13776 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13777 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13778 vp_state_create_info.viewportCount = 1;
13779 VkViewport viewport = {};
13780 vp_state_create_info.pViewports = &viewport;
13781 vp_state_create_info.scissorCount = 1;
13782 VkRect2D scissors = {};
13783 vp_state_create_info.pScissors = &scissors;
13784
13785 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13786
13787 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13788 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13789 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13790 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13791
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013792 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013793
13794 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13795 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13796
13797 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13798 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13799 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13800
13801 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13802 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13803 rasterization_state_create_info.pNext = nullptr;
13804 rasterization_state_create_info.lineWidth = 1.0f;
13805 rasterization_state_create_info.rasterizerDiscardEnable = true;
13806
13807 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13808 color_blend_attachment_state.blendEnable = VK_FALSE;
13809 color_blend_attachment_state.colorWriteMask = 0xf;
13810
13811 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13812 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13813 color_blend_state_create_info.attachmentCount = 1;
13814 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13815
13816 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13817 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13818 graphicspipe_create_info.stageCount = 2;
13819 graphicspipe_create_info.pStages = shader_stage_create_info;
13820 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13821 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13822 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13823 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13824 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13825 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13826 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13827 graphicspipe_create_info.layout = pipeline_layout;
13828 graphicspipe_create_info.renderPass = renderPass();
13829
13830 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13831 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13832
13833 VkPipelineCache pipelineCache;
13834 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13835
13836 // This structure maps constant ids to data locations.
13837 const VkSpecializationMapEntry entry =
13838 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013839 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013840
13841 uint32_t data = 1;
13842
13843 // Set up the info describing spec map and data
13844 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013845 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013846 };
13847 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13848
13849 VkPipeline pipeline;
13850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13851 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13852 m_errorMonitor->VerifyFound();
13853
13854 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13855 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13856}
13857
13858TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13859 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13860
Tony Barbour1fa09702017-03-16 12:09:08 -060013861 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013862 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13863
13864 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13865
13866 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13867 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13868 descriptor_pool_type_count[0].descriptorCount = 1;
13869 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13870 descriptor_pool_type_count[1].descriptorCount = 1;
13871
13872 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13873 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13874 descriptor_pool_create_info.maxSets = 1;
13875 descriptor_pool_create_info.poolSizeCount = 2;
13876 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13877 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13878
13879 VkDescriptorPool descriptorset_pool;
13880 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13881
13882 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13883 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13884 descriptorset_layout_binding.descriptorCount = 1;
13885 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013886 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013887
13888 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13889 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13890 descriptorset_layout_create_info.bindingCount = 1;
13891 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13892
13893 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013894 ASSERT_VK_SUCCESS(
13895 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013896
13897 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13898 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13899 descriptorset_allocate_info.descriptorSetCount = 1;
13900 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13901 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13902 VkDescriptorSet descriptorset;
13903 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13904
13905 // Challenge core_validation with a non uniform buffer type.
13906 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13907
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013908 char const *vsSource =
13909 "#version 450\n"
13910 "\n"
13911 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13912 " mat4 mvp;\n"
13913 "} ubuf;\n"
13914 "out gl_PerVertex {\n"
13915 " vec4 gl_Position;\n"
13916 "};\n"
13917 "void main(){\n"
13918 " gl_Position = ubuf.mvp * vec4(1);\n"
13919 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013920
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013921 char const *fsSource =
13922 "#version 450\n"
13923 "\n"
13924 "layout(location = 0) out vec4 uFragColor;\n"
13925 "void main(){\n"
13926 " uFragColor = vec4(0,1,0,1);\n"
13927 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013928
13929 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13930 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13931
13932 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13933 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13934 pipeline_layout_create_info.setLayoutCount = 1;
13935 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13936
13937 VkPipelineLayout pipeline_layout;
13938 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13939
13940 VkPipelineObj pipe(m_device);
13941 pipe.AddColorAttachment();
13942 pipe.AddShader(&vs);
13943 pipe.AddShader(&fs);
13944
13945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13946 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13947 m_errorMonitor->VerifyFound();
13948
13949 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13950 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13951 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13952}
13953
13954TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13955 TEST_DESCRIPTION(
13956 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13957
Tony Barbour1fa09702017-03-16 12:09:08 -060013958 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13960
13961 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13962
13963 VkDescriptorPoolSize descriptor_pool_type_count = {};
13964 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13965 descriptor_pool_type_count.descriptorCount = 1;
13966
13967 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13968 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13969 descriptor_pool_create_info.maxSets = 1;
13970 descriptor_pool_create_info.poolSizeCount = 1;
13971 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13972 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13973
13974 VkDescriptorPool descriptorset_pool;
13975 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13976
13977 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13978 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13979 descriptorset_layout_binding.descriptorCount = 1;
13980 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13981 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013982 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013983
13984 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13985 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13986 descriptorset_layout_create_info.bindingCount = 1;
13987 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13988
13989 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013990 ASSERT_VK_SUCCESS(
13991 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013992
13993 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13994 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13995 descriptorset_allocate_info.descriptorSetCount = 1;
13996 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13997 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13998 VkDescriptorSet descriptorset;
13999 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14000
14001 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
14002
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014003 char const *vsSource =
14004 "#version 450\n"
14005 "\n"
14006 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14007 " mat4 mvp;\n"
14008 "} ubuf;\n"
14009 "out gl_PerVertex {\n"
14010 " vec4 gl_Position;\n"
14011 "};\n"
14012 "void main(){\n"
14013 " gl_Position = ubuf.mvp * vec4(1);\n"
14014 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014015
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014016 char const *fsSource =
14017 "#version 450\n"
14018 "\n"
14019 "layout(location = 0) out vec4 uFragColor;\n"
14020 "void main(){\n"
14021 " uFragColor = vec4(0,1,0,1);\n"
14022 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014023
14024 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14025 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14026
14027 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14028 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14029 pipeline_layout_create_info.setLayoutCount = 1;
14030 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14031
14032 VkPipelineLayout pipeline_layout;
14033 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14034
14035 VkPipelineObj pipe(m_device);
14036 pipe.AddColorAttachment();
14037 pipe.AddShader(&vs);
14038 pipe.AddShader(&fs);
14039
14040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14041 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14042 m_errorMonitor->VerifyFound();
14043
14044 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14045 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14046 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14047}
14048
14049TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014050 TEST_DESCRIPTION(
14051 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14052 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014053
Tony Barbour1fa09702017-03-16 12:09:08 -060014054 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014055 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14056
14057 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014058 "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 -060014059
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014060 char const *vsSource =
14061 "#version 450\n"
14062 "\n"
14063 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14064 "out gl_PerVertex {\n"
14065 " vec4 gl_Position;\n"
14066 "};\n"
14067 "void main(){\n"
14068 " gl_Position = vec4(consts.x);\n"
14069 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014070
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014071 char const *fsSource =
14072 "#version 450\n"
14073 "\n"
14074 "layout(location = 0) out vec4 uFragColor;\n"
14075 "void main(){\n"
14076 " uFragColor = vec4(0,1,0,1);\n"
14077 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014078
14079 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14080 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14081
14082 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14083 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14084
14085 // Set up a push constant range
14086 VkPushConstantRange push_constant_ranges = {};
14087 // Set to the wrong stage to challenge core_validation
14088 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14089 push_constant_ranges.size = 4;
14090
14091 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14092 pipeline_layout_create_info.pushConstantRangeCount = 1;
14093
14094 VkPipelineLayout pipeline_layout;
14095 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14096
14097 VkPipelineObj pipe(m_device);
14098 pipe.AddColorAttachment();
14099 pipe.AddShader(&vs);
14100 pipe.AddShader(&fs);
14101
14102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14103 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14104 m_errorMonitor->VerifyFound();
14105
14106 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14107}
14108
14109TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14110 TEST_DESCRIPTION(
14111 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14112
Tony Barbour1fa09702017-03-16 12:09:08 -060014113 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014114 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14115
14116 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014117 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014118
14119 // Some awkward steps are required to test with custom device features.
14120 std::vector<const char *> device_extension_names;
14121 auto features = m_device->phy().features();
14122 // Disable support for 64 bit floats
14123 features.shaderFloat64 = false;
14124 // The sacrificial device object
14125 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14126
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014127 char const *vsSource =
14128 "#version 450\n"
14129 "\n"
14130 "out gl_PerVertex {\n"
14131 " vec4 gl_Position;\n"
14132 "};\n"
14133 "void main(){\n"
14134 " gl_Position = vec4(1);\n"
14135 "}\n";
14136 char const *fsSource =
14137 "#version 450\n"
14138 "\n"
14139 "layout(location=0) out vec4 color;\n"
14140 "void main(){\n"
14141 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14142 " color = vec4(green);\n"
14143 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014144
14145 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14146 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14147
14148 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014149
14150 VkPipelineObj pipe(&test_device);
14151 pipe.AddColorAttachment();
14152 pipe.AddShader(&vs);
14153 pipe.AddShader(&fs);
14154
14155 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14156 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14157 VkPipelineLayout pipeline_layout;
14158 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14159
14160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14161 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14162 m_errorMonitor->VerifyFound();
14163
14164 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14165}
14166
Mark Lobodzinski20832822017-03-24 14:49:45 -060014167TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14168 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14169 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014170
Tony Barbour1fa09702017-03-16 12:09:08 -060014171 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014172 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14173
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014174 char const *vsSource =
14175 "#version 450\n"
14176 "\n"
14177 "out gl_PerVertex {\n"
14178 " vec4 gl_Position;\n"
14179 "};\n"
14180 "layout(xfb_buffer = 1) out;"
14181 "void main(){\n"
14182 " gl_Position = vec4(1);\n"
14183 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014184
Mark Lobodzinski20832822017-03-24 14:49:45 -060014185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014186
Mark Lobodzinski20832822017-03-24 14:49:45 -060014187 std::vector<unsigned int> spv;
14188 VkShaderModuleCreateInfo module_create_info;
14189 VkShaderModule shader_module;
14190 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14191 module_create_info.pNext = NULL;
14192 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14193 module_create_info.pCode = spv.data();
14194 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14195 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014196
Mark Lobodzinski20832822017-03-24 14:49:45 -060014197 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014198
Mark Lobodzinski20832822017-03-24 14:49:45 -060014199 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014200}
14201
Karl Schultz6addd812016-02-02 17:17:23 -070014202TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014203 TEST_DESCRIPTION(
14204 "Test that an error is produced for a fragment shader input "
14205 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014206
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014208
Tony Barbour1fa09702017-03-16 12:09:08 -060014209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014210 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014211
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014212 char const *vsSource =
14213 "#version 450\n"
14214 "\n"
14215 "out gl_PerVertex {\n"
14216 " vec4 gl_Position;\n"
14217 "};\n"
14218 "void main(){\n"
14219 " gl_Position = vec4(1);\n"
14220 "}\n";
14221 char const *fsSource =
14222 "#version 450\n"
14223 "\n"
14224 "layout(location=0) in float x;\n"
14225 "layout(location=0) out vec4 color;\n"
14226 "void main(){\n"
14227 " color = vec4(x);\n"
14228 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014229
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014230 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14231 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014232
14233 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014234 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014235 pipe.AddShader(&vs);
14236 pipe.AddShader(&fs);
14237
Chris Forbes59cb88d2015-05-25 11:13:13 +120014238 VkDescriptorSetObj descriptorSet(m_device);
14239 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014240 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014241
Tony Barbour5781e8f2015-08-04 16:23:11 -060014242 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014243
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014244 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014245}
14246
Karl Schultz6addd812016-02-02 17:17:23 -070014247TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014248 TEST_DESCRIPTION(
14249 "Test that an error is produced for a fragment shader input "
14250 "within an interace block, which is not present in the outputs "
14251 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014253
Tony Barbour1fa09702017-03-16 12:09:08 -060014254 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014255 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14256
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014257 char const *vsSource =
14258 "#version 450\n"
14259 "\n"
14260 "out gl_PerVertex {\n"
14261 " vec4 gl_Position;\n"
14262 "};\n"
14263 "void main(){\n"
14264 " gl_Position = vec4(1);\n"
14265 "}\n";
14266 char const *fsSource =
14267 "#version 450\n"
14268 "\n"
14269 "in block { layout(location=0) float x; } ins;\n"
14270 "layout(location=0) out vec4 color;\n"
14271 "void main(){\n"
14272 " color = vec4(ins.x);\n"
14273 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014274
14275 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14276 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14277
14278 VkPipelineObj pipe(m_device);
14279 pipe.AddColorAttachment();
14280 pipe.AddShader(&vs);
14281 pipe.AddShader(&fs);
14282
14283 VkDescriptorSetObj descriptorSet(m_device);
14284 descriptorSet.AppendDummy();
14285 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14286
14287 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14288
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014289 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014290}
14291
Karl Schultz6addd812016-02-02 17:17:23 -070014292TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014293 TEST_DESCRIPTION(
14294 "Test that an error is produced for mismatched array sizes "
14295 "across the vertex->fragment shader interface");
14296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14297 "Type mismatch on location 0.0: 'ptr to "
14298 "output arr[2] of float32' vs 'ptr to "
14299 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014300
Tony Barbour1fa09702017-03-16 12:09:08 -060014301 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14303
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014304 char const *vsSource =
14305 "#version 450\n"
14306 "\n"
14307 "layout(location=0) out float x[2];\n"
14308 "out gl_PerVertex {\n"
14309 " vec4 gl_Position;\n"
14310 "};\n"
14311 "void main(){\n"
14312 " x[0] = 0; x[1] = 0;\n"
14313 " gl_Position = vec4(1);\n"
14314 "}\n";
14315 char const *fsSource =
14316 "#version 450\n"
14317 "\n"
14318 "layout(location=0) in float x[1];\n"
14319 "layout(location=0) out vec4 color;\n"
14320 "void main(){\n"
14321 " color = vec4(x[0]);\n"
14322 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014323
14324 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14325 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14326
14327 VkPipelineObj pipe(m_device);
14328 pipe.AddColorAttachment();
14329 pipe.AddShader(&vs);
14330 pipe.AddShader(&fs);
14331
14332 VkDescriptorSetObj descriptorSet(m_device);
14333 descriptorSet.AppendDummy();
14334 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14335
14336 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14337
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014338 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014339}
14340
Karl Schultz6addd812016-02-02 17:17:23 -070014341TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014342 TEST_DESCRIPTION(
14343 "Test that an error is produced for mismatched types across "
14344 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014346
Tony Barbour1fa09702017-03-16 12:09:08 -060014347 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014349
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014350 char const *vsSource =
14351 "#version 450\n"
14352 "\n"
14353 "layout(location=0) out int x;\n"
14354 "out gl_PerVertex {\n"
14355 " vec4 gl_Position;\n"
14356 "};\n"
14357 "void main(){\n"
14358 " x = 0;\n"
14359 " gl_Position = vec4(1);\n"
14360 "}\n";
14361 char const *fsSource =
14362 "#version 450\n"
14363 "\n"
14364 "layout(location=0) in float x;\n" /* VS writes int */
14365 "layout(location=0) out vec4 color;\n"
14366 "void main(){\n"
14367 " color = vec4(x);\n"
14368 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014369
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014370 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14371 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014372
14373 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014374 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014375 pipe.AddShader(&vs);
14376 pipe.AddShader(&fs);
14377
Chris Forbesb56af562015-05-25 11:13:17 +120014378 VkDescriptorSetObj descriptorSet(m_device);
14379 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014380 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014381
Tony Barbour5781e8f2015-08-04 16:23:11 -060014382 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014383
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014384 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014385}
14386
Karl Schultz6addd812016-02-02 17:17:23 -070014387TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014388 TEST_DESCRIPTION(
14389 "Test that an error is produced for mismatched types across "
14390 "the vertex->fragment shader interface, when the variable is contained within "
14391 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014393
Tony Barbour1fa09702017-03-16 12:09:08 -060014394 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14396
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014397 char const *vsSource =
14398 "#version 450\n"
14399 "\n"
14400 "out block { layout(location=0) int x; } outs;\n"
14401 "out gl_PerVertex {\n"
14402 " vec4 gl_Position;\n"
14403 "};\n"
14404 "void main(){\n"
14405 " outs.x = 0;\n"
14406 " gl_Position = vec4(1);\n"
14407 "}\n";
14408 char const *fsSource =
14409 "#version 450\n"
14410 "\n"
14411 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14412 "layout(location=0) out vec4 color;\n"
14413 "void main(){\n"
14414 " color = vec4(ins.x);\n"
14415 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014416
14417 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14418 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14419
14420 VkPipelineObj pipe(m_device);
14421 pipe.AddColorAttachment();
14422 pipe.AddShader(&vs);
14423 pipe.AddShader(&fs);
14424
14425 VkDescriptorSetObj descriptorSet(m_device);
14426 descriptorSet.AppendDummy();
14427 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14428
14429 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14430
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014431 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014432}
14433
14434TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014435 TEST_DESCRIPTION(
14436 "Test that an error is produced for location mismatches across "
14437 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14438 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014439 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 +130014440
Tony Barbour1fa09702017-03-16 12:09:08 -060014441 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014442 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14443
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014444 char const *vsSource =
14445 "#version 450\n"
14446 "\n"
14447 "out block { layout(location=1) float x; } outs;\n"
14448 "out gl_PerVertex {\n"
14449 " vec4 gl_Position;\n"
14450 "};\n"
14451 "void main(){\n"
14452 " outs.x = 0;\n"
14453 " gl_Position = vec4(1);\n"
14454 "}\n";
14455 char const *fsSource =
14456 "#version 450\n"
14457 "\n"
14458 "in block { layout(location=0) float x; } ins;\n"
14459 "layout(location=0) out vec4 color;\n"
14460 "void main(){\n"
14461 " color = vec4(ins.x);\n"
14462 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014463
14464 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14465 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14466
14467 VkPipelineObj pipe(m_device);
14468 pipe.AddColorAttachment();
14469 pipe.AddShader(&vs);
14470 pipe.AddShader(&fs);
14471
14472 VkDescriptorSetObj descriptorSet(m_device);
14473 descriptorSet.AppendDummy();
14474 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14475
14476 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14477
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014478 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014479}
14480
14481TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014482 TEST_DESCRIPTION(
14483 "Test that an error is produced for component mismatches across the "
14484 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14485 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014486 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 +130014487
Tony Barbour1fa09702017-03-16 12:09:08 -060014488 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014489 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14490
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014491 char const *vsSource =
14492 "#version 450\n"
14493 "\n"
14494 "out block { layout(location=0, component=0) float x; } outs;\n"
14495 "out gl_PerVertex {\n"
14496 " vec4 gl_Position;\n"
14497 "};\n"
14498 "void main(){\n"
14499 " outs.x = 0;\n"
14500 " gl_Position = vec4(1);\n"
14501 "}\n";
14502 char const *fsSource =
14503 "#version 450\n"
14504 "\n"
14505 "in block { layout(location=0, component=1) float x; } ins;\n"
14506 "layout(location=0) out vec4 color;\n"
14507 "void main(){\n"
14508 " color = vec4(ins.x);\n"
14509 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014510
14511 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14512 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14513
14514 VkPipelineObj pipe(m_device);
14515 pipe.AddColorAttachment();
14516 pipe.AddShader(&vs);
14517 pipe.AddShader(&fs);
14518
14519 VkDescriptorSetObj descriptorSet(m_device);
14520 descriptorSet.AppendDummy();
14521 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14522
14523 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14524
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014525 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014526}
14527
Chris Forbes1f3b0152016-11-30 12:48:40 +130014528TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14529 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14530
Tony Barbour1fa09702017-03-16 12:09:08 -060014531 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014532 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14533
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014534 char const *vsSource =
14535 "#version 450\n"
14536 "layout(location=0) out mediump float x;\n"
14537 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14538 char const *fsSource =
14539 "#version 450\n"
14540 "layout(location=0) in highp float x;\n"
14541 "layout(location=0) out vec4 color;\n"
14542 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014543
14544 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14545 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14546
14547 VkPipelineObj pipe(m_device);
14548 pipe.AddColorAttachment();
14549 pipe.AddShader(&vs);
14550 pipe.AddShader(&fs);
14551
14552 VkDescriptorSetObj descriptorSet(m_device);
14553 descriptorSet.AppendDummy();
14554 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14555
14556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14557
14558 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14559
14560 m_errorMonitor->VerifyFound();
14561}
14562
Chris Forbes870a39e2016-11-30 12:55:56 +130014563TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14564 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14565
Tony Barbour1fa09702017-03-16 12:09:08 -060014566 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014567 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14568
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014569 char const *vsSource =
14570 "#version 450\n"
14571 "out block { layout(location=0) mediump float x; };\n"
14572 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14573 char const *fsSource =
14574 "#version 450\n"
14575 "in block { layout(location=0) highp float x; };\n"
14576 "layout(location=0) out vec4 color;\n"
14577 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014578
14579 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14580 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14581
14582 VkPipelineObj pipe(m_device);
14583 pipe.AddColorAttachment();
14584 pipe.AddShader(&vs);
14585 pipe.AddShader(&fs);
14586
14587 VkDescriptorSetObj descriptorSet(m_device);
14588 descriptorSet.AppendDummy();
14589 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14590
14591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14592
14593 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14594
14595 m_errorMonitor->VerifyFound();
14596}
14597
Karl Schultz6addd812016-02-02 17:17:23 -070014598TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014599 TEST_DESCRIPTION(
14600 "Test that a warning is produced for a vertex attribute which is "
14601 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014603
Tony Barbour1fa09702017-03-16 12:09:08 -060014604 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014605 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014606
14607 VkVertexInputBindingDescription input_binding;
14608 memset(&input_binding, 0, sizeof(input_binding));
14609
14610 VkVertexInputAttributeDescription input_attrib;
14611 memset(&input_attrib, 0, sizeof(input_attrib));
14612 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14613
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014614 char const *vsSource =
14615 "#version 450\n"
14616 "\n"
14617 "out gl_PerVertex {\n"
14618 " vec4 gl_Position;\n"
14619 "};\n"
14620 "void main(){\n"
14621 " gl_Position = vec4(1);\n"
14622 "}\n";
14623 char const *fsSource =
14624 "#version 450\n"
14625 "\n"
14626 "layout(location=0) out vec4 color;\n"
14627 "void main(){\n"
14628 " color = vec4(1);\n"
14629 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014630
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014631 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14632 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014633
14634 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014635 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014636 pipe.AddShader(&vs);
14637 pipe.AddShader(&fs);
14638
14639 pipe.AddVertexInputBindings(&input_binding, 1);
14640 pipe.AddVertexInputAttribs(&input_attrib, 1);
14641
Chris Forbesde136e02015-05-25 11:13:28 +120014642 VkDescriptorSetObj descriptorSet(m_device);
14643 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014644 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014645
Tony Barbour5781e8f2015-08-04 16:23:11 -060014646 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014647
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014648 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014649}
14650
Karl Schultz6addd812016-02-02 17:17:23 -070014651TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014652 TEST_DESCRIPTION(
14653 "Test that a warning is produced for a location mismatch on "
14654 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014656
Tony Barbour1fa09702017-03-16 12:09:08 -060014657 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14659
14660 VkVertexInputBindingDescription input_binding;
14661 memset(&input_binding, 0, sizeof(input_binding));
14662
14663 VkVertexInputAttributeDescription input_attrib;
14664 memset(&input_attrib, 0, sizeof(input_attrib));
14665 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14666
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014667 char const *vsSource =
14668 "#version 450\n"
14669 "\n"
14670 "layout(location=1) in float x;\n"
14671 "out gl_PerVertex {\n"
14672 " vec4 gl_Position;\n"
14673 "};\n"
14674 "void main(){\n"
14675 " gl_Position = vec4(x);\n"
14676 "}\n";
14677 char const *fsSource =
14678 "#version 450\n"
14679 "\n"
14680 "layout(location=0) out vec4 color;\n"
14681 "void main(){\n"
14682 " color = vec4(1);\n"
14683 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014684
14685 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14686 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14687
14688 VkPipelineObj pipe(m_device);
14689 pipe.AddColorAttachment();
14690 pipe.AddShader(&vs);
14691 pipe.AddShader(&fs);
14692
14693 pipe.AddVertexInputBindings(&input_binding, 1);
14694 pipe.AddVertexInputAttribs(&input_attrib, 1);
14695
14696 VkDescriptorSetObj descriptorSet(m_device);
14697 descriptorSet.AppendDummy();
14698 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14699
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014700 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014701 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14702
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014703 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014704}
14705
Karl Schultz6addd812016-02-02 17:17:23 -070014706TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014707 TEST_DESCRIPTION(
14708 "Test that an error is produced for a vertex shader input which is not "
14709 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14711 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014712
Tony Barbour1fa09702017-03-16 12:09:08 -060014713 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014714 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014715
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014716 char const *vsSource =
14717 "#version 450\n"
14718 "\n"
14719 "layout(location=0) in vec4 x;\n" /* not provided */
14720 "out gl_PerVertex {\n"
14721 " vec4 gl_Position;\n"
14722 "};\n"
14723 "void main(){\n"
14724 " gl_Position = x;\n"
14725 "}\n";
14726 char const *fsSource =
14727 "#version 450\n"
14728 "\n"
14729 "layout(location=0) out vec4 color;\n"
14730 "void main(){\n"
14731 " color = vec4(1);\n"
14732 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014733
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014734 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14735 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014736
14737 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014738 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014739 pipe.AddShader(&vs);
14740 pipe.AddShader(&fs);
14741
Chris Forbes62e8e502015-05-25 11:13:29 +120014742 VkDescriptorSetObj descriptorSet(m_device);
14743 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014744 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014745
Tony Barbour5781e8f2015-08-04 16:23:11 -060014746 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014747
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014748 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014749}
14750
Karl Schultz6addd812016-02-02 17:17:23 -070014751TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014752 TEST_DESCRIPTION(
14753 "Test that an error is produced for a mismatch between the "
14754 "fundamental type (float/int/uint) of an attribute and the "
14755 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014756 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 -060014757
Tony Barbour1fa09702017-03-16 12:09:08 -060014758 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014760
14761 VkVertexInputBindingDescription input_binding;
14762 memset(&input_binding, 0, sizeof(input_binding));
14763
14764 VkVertexInputAttributeDescription input_attrib;
14765 memset(&input_attrib, 0, sizeof(input_attrib));
14766 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14767
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014768 char const *vsSource =
14769 "#version 450\n"
14770 "\n"
14771 "layout(location=0) in int x;\n" /* attrib provided float */
14772 "out gl_PerVertex {\n"
14773 " vec4 gl_Position;\n"
14774 "};\n"
14775 "void main(){\n"
14776 " gl_Position = vec4(x);\n"
14777 "}\n";
14778 char const *fsSource =
14779 "#version 450\n"
14780 "\n"
14781 "layout(location=0) out vec4 color;\n"
14782 "void main(){\n"
14783 " color = vec4(1);\n"
14784 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014785
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014786 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14787 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014788
14789 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014790 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014791 pipe.AddShader(&vs);
14792 pipe.AddShader(&fs);
14793
14794 pipe.AddVertexInputBindings(&input_binding, 1);
14795 pipe.AddVertexInputAttribs(&input_attrib, 1);
14796
Chris Forbesc97d98e2015-05-25 11:13:31 +120014797 VkDescriptorSetObj descriptorSet(m_device);
14798 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014799 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014800
Tony Barbour5781e8f2015-08-04 16:23:11 -060014801 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014802
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014803 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014804}
14805
Chris Forbesc68b43c2016-04-06 11:18:47 +120014806TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014807 TEST_DESCRIPTION(
14808 "Test that an error is produced for a pipeline containing multiple "
14809 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14811 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014812
Tony Barbour1fa09702017-03-16 12:09:08 -060014813 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014814 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14815
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014816 char const *vsSource =
14817 "#version 450\n"
14818 "\n"
14819 "out gl_PerVertex {\n"
14820 " vec4 gl_Position;\n"
14821 "};\n"
14822 "void main(){\n"
14823 " gl_Position = vec4(1);\n"
14824 "}\n";
14825 char const *fsSource =
14826 "#version 450\n"
14827 "\n"
14828 "layout(location=0) out vec4 color;\n"
14829 "void main(){\n"
14830 " color = vec4(1);\n"
14831 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014832
14833 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14834 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14835
14836 VkPipelineObj pipe(m_device);
14837 pipe.AddColorAttachment();
14838 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014839 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014840 pipe.AddShader(&fs);
14841
14842 VkDescriptorSetObj descriptorSet(m_device);
14843 descriptorSet.AppendDummy();
14844 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14845
14846 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14847
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014848 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014849}
14850
Chris Forbes82ff92a2016-09-09 10:50:24 +120014851TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014853
Tony Barbour1fa09702017-03-16 12:09:08 -060014854 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014855 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14856
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014857 char const *vsSource =
14858 "#version 450\n"
14859 "out gl_PerVertex {\n"
14860 " vec4 gl_Position;\n"
14861 "};\n"
14862 "void main(){\n"
14863 " gl_Position = vec4(0);\n"
14864 "}\n";
14865 char const *fsSource =
14866 "#version 450\n"
14867 "\n"
14868 "layout(location=0) out vec4 color;\n"
14869 "void main(){\n"
14870 " color = vec4(1);\n"
14871 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014872
14873 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14874 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14875
14876 VkPipelineObj pipe(m_device);
14877 pipe.AddColorAttachment();
14878 pipe.AddShader(&vs);
14879 pipe.AddShader(&fs);
14880
14881 VkDescriptorSetObj descriptorSet(m_device);
14882 descriptorSet.AppendDummy();
14883 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14884
14885 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14886
14887 m_errorMonitor->VerifyFound();
14888}
14889
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014890TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14892 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14893 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014894
Tony Barbour1fa09702017-03-16 12:09:08 -060014895 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14897
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014898 char const *vsSource =
14899 "#version 450\n"
14900 "void main(){ gl_Position = vec4(0); }\n";
14901 char const *fsSource =
14902 "#version 450\n"
14903 "\n"
14904 "layout(location=0) out vec4 color;\n"
14905 "void main(){\n"
14906 " color = vec4(1);\n"
14907 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014908
14909 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14910 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14911
14912 VkPipelineObj pipe(m_device);
14913 pipe.AddColorAttachment();
14914 pipe.AddShader(&vs);
14915 pipe.AddShader(&fs);
14916
14917 VkDescriptorSetObj descriptorSet(m_device);
14918 descriptorSet.AppendDummy();
14919 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14920
14921 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014922 {
14923 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14924 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14925 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014926 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014927 {
14928 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14929 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14930 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014931 },
14932 };
14933 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014934 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014935 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014936 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14937 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014938 VkRenderPass rp;
14939 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14940 ASSERT_VK_SUCCESS(err);
14941
14942 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14943
14944 m_errorMonitor->VerifyFound();
14945
14946 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14947}
14948
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014949TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014950 TEST_DESCRIPTION(
14951 "Test that an error is produced for a variable output from "
14952 "the TCS without the patch decoration, but consumed in the TES "
14953 "with the decoration.");
14954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14955 "is per-vertex in tessellation control shader stage "
14956 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014957
Tony Barbour1fa09702017-03-16 12:09:08 -060014958 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14960
Chris Forbesc1e852d2016-04-04 19:26:42 +120014961 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014962 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014963 return;
14964 }
14965
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014966 char const *vsSource =
14967 "#version 450\n"
14968 "void main(){}\n";
14969 char const *tcsSource =
14970 "#version 450\n"
14971 "layout(location=0) out int x[];\n"
14972 "layout(vertices=3) out;\n"
14973 "void main(){\n"
14974 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14975 " gl_TessLevelInner[0] = 1;\n"
14976 " x[gl_InvocationID] = gl_InvocationID;\n"
14977 "}\n";
14978 char const *tesSource =
14979 "#version 450\n"
14980 "layout(triangles, equal_spacing, cw) in;\n"
14981 "layout(location=0) patch in int x;\n"
14982 "out gl_PerVertex { vec4 gl_Position; };\n"
14983 "void main(){\n"
14984 " gl_Position.xyz = gl_TessCoord;\n"
14985 " gl_Position.w = x;\n"
14986 "}\n";
14987 char const *fsSource =
14988 "#version 450\n"
14989 "layout(location=0) out vec4 color;\n"
14990 "void main(){\n"
14991 " color = vec4(1);\n"
14992 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014993
14994 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14995 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14996 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14997 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14998
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014999 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15000 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015001
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015002 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015003
15004 VkPipelineObj pipe(m_device);
15005 pipe.SetInputAssembly(&iasci);
15006 pipe.SetTessellation(&tsci);
15007 pipe.AddColorAttachment();
15008 pipe.AddShader(&vs);
15009 pipe.AddShader(&tcs);
15010 pipe.AddShader(&tes);
15011 pipe.AddShader(&fs);
15012
15013 VkDescriptorSetObj descriptorSet(m_device);
15014 descriptorSet.AppendDummy();
15015 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15016
15017 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15018
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015019 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015020}
15021
Karl Schultz6addd812016-02-02 17:17:23 -070015022TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015023 TEST_DESCRIPTION(
15024 "Test that an error is produced for a vertex attribute setup where multiple "
15025 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15027 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015028
Tony Barbour1fa09702017-03-16 12:09:08 -060015029 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015030 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015031
15032 /* Two binding descriptions for binding 0 */
15033 VkVertexInputBindingDescription input_bindings[2];
15034 memset(input_bindings, 0, sizeof(input_bindings));
15035
15036 VkVertexInputAttributeDescription input_attrib;
15037 memset(&input_attrib, 0, sizeof(input_attrib));
15038 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15039
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015040 char const *vsSource =
15041 "#version 450\n"
15042 "\n"
15043 "layout(location=0) in float x;\n" /* attrib provided float */
15044 "out gl_PerVertex {\n"
15045 " vec4 gl_Position;\n"
15046 "};\n"
15047 "void main(){\n"
15048 " gl_Position = vec4(x);\n"
15049 "}\n";
15050 char const *fsSource =
15051 "#version 450\n"
15052 "\n"
15053 "layout(location=0) out vec4 color;\n"
15054 "void main(){\n"
15055 " color = vec4(1);\n"
15056 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015057
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015058 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15059 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015060
15061 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015062 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015063 pipe.AddShader(&vs);
15064 pipe.AddShader(&fs);
15065
15066 pipe.AddVertexInputBindings(input_bindings, 2);
15067 pipe.AddVertexInputAttribs(&input_attrib, 1);
15068
Chris Forbes280ba2c2015-06-12 11:16:41 +120015069 VkDescriptorSetObj descriptorSet(m_device);
15070 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015071 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015072
Tony Barbour5781e8f2015-08-04 16:23:11 -060015073 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015074
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015075 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015076}
Chris Forbes8f68b562015-05-25 11:13:32 +120015077
Karl Schultz6addd812016-02-02 17:17:23 -070015078TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015079 TEST_DESCRIPTION(
15080 "Test that an error is produced for a fragment shader which does not "
15081 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015083
Tony Barbour1fa09702017-03-16 12:09:08 -060015084 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015085
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015086 char const *vsSource =
15087 "#version 450\n"
15088 "\n"
15089 "out gl_PerVertex {\n"
15090 " vec4 gl_Position;\n"
15091 "};\n"
15092 "void main(){\n"
15093 " gl_Position = vec4(1);\n"
15094 "}\n";
15095 char const *fsSource =
15096 "#version 450\n"
15097 "\n"
15098 "void main(){\n"
15099 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015100
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015101 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15102 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015103
15104 VkPipelineObj pipe(m_device);
15105 pipe.AddShader(&vs);
15106 pipe.AddShader(&fs);
15107
Chia-I Wu08accc62015-07-07 11:50:03 +080015108 /* set up CB 0, not written */
15109 pipe.AddColorAttachment();
15110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015111
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015112 VkDescriptorSetObj descriptorSet(m_device);
15113 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015114 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015115
Tony Barbour5781e8f2015-08-04 16:23:11 -060015116 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015117
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015118 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015119}
15120
Karl Schultz6addd812016-02-02 17:17:23 -070015121TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015122 TEST_DESCRIPTION(
15123 "Test that a warning is produced for a fragment shader which provides a spurious "
15124 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015126 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015127
Tony Barbour1fa09702017-03-16 12:09:08 -060015128 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015129
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015130 char const *vsSource =
15131 "#version 450\n"
15132 "\n"
15133 "out gl_PerVertex {\n"
15134 " vec4 gl_Position;\n"
15135 "};\n"
15136 "void main(){\n"
15137 " gl_Position = vec4(1);\n"
15138 "}\n";
15139 char const *fsSource =
15140 "#version 450\n"
15141 "\n"
15142 "layout(location=0) out vec4 x;\n"
15143 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15144 "void main(){\n"
15145 " x = vec4(1);\n"
15146 " y = vec4(1);\n"
15147 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015148
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015149 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15150 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015151
15152 VkPipelineObj pipe(m_device);
15153 pipe.AddShader(&vs);
15154 pipe.AddShader(&fs);
15155
Chia-I Wu08accc62015-07-07 11:50:03 +080015156 /* set up CB 0, not written */
15157 pipe.AddColorAttachment();
15158 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015159 /* FS writes CB 1, but we don't configure it */
15160
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015161 VkDescriptorSetObj descriptorSet(m_device);
15162 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015163 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015164
Tony Barbour5781e8f2015-08-04 16:23:11 -060015165 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015166
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015167 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015168}
15169
Karl Schultz6addd812016-02-02 17:17:23 -070015170TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015171 TEST_DESCRIPTION(
15172 "Test that an error is produced for a mismatch between the fundamental "
15173 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015175
Tony Barbour1fa09702017-03-16 12:09:08 -060015176 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015177
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015178 char const *vsSource =
15179 "#version 450\n"
15180 "\n"
15181 "out gl_PerVertex {\n"
15182 " vec4 gl_Position;\n"
15183 "};\n"
15184 "void main(){\n"
15185 " gl_Position = vec4(1);\n"
15186 "}\n";
15187 char const *fsSource =
15188 "#version 450\n"
15189 "\n"
15190 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15191 "void main(){\n"
15192 " x = ivec4(1);\n"
15193 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015194
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015195 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15196 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015197
15198 VkPipelineObj pipe(m_device);
15199 pipe.AddShader(&vs);
15200 pipe.AddShader(&fs);
15201
Chia-I Wu08accc62015-07-07 11:50:03 +080015202 /* set up CB 0; type is UNORM by default */
15203 pipe.AddColorAttachment();
15204 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015205
Chris Forbesa36d69e2015-05-25 11:13:44 +120015206 VkDescriptorSetObj descriptorSet(m_device);
15207 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015208 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015209
Tony Barbour5781e8f2015-08-04 16:23:11 -060015210 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015211
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015212 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015213}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015214
Karl Schultz6addd812016-02-02 17:17:23 -070015215TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015216 TEST_DESCRIPTION(
15217 "Test that an error is produced for a shader consuming a uniform "
15218 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015220
Tony Barbour1fa09702017-03-16 12:09:08 -060015221 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015222
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015223 char const *vsSource =
15224 "#version 450\n"
15225 "\n"
15226 "out gl_PerVertex {\n"
15227 " vec4 gl_Position;\n"
15228 "};\n"
15229 "void main(){\n"
15230 " gl_Position = vec4(1);\n"
15231 "}\n";
15232 char const *fsSource =
15233 "#version 450\n"
15234 "\n"
15235 "layout(location=0) out vec4 x;\n"
15236 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15237 "void main(){\n"
15238 " x = vec4(bar.y);\n"
15239 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015240
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015241 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15242 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015243
Chris Forbes556c76c2015-08-14 12:04:59 +120015244 VkPipelineObj pipe(m_device);
15245 pipe.AddShader(&vs);
15246 pipe.AddShader(&fs);
15247
15248 /* set up CB 0; type is UNORM by default */
15249 pipe.AddColorAttachment();
15250 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15251
15252 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015253 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015254
15255 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15256
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015257 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015258}
15259
Chris Forbes5c59e902016-02-26 16:56:09 +130015260TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015261 TEST_DESCRIPTION(
15262 "Test that an error is produced for a shader consuming push constants "
15263 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015265
Tony Barbour1fa09702017-03-16 12:09:08 -060015266 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015267
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015268 char const *vsSource =
15269 "#version 450\n"
15270 "\n"
15271 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15272 "out gl_PerVertex {\n"
15273 " vec4 gl_Position;\n"
15274 "};\n"
15275 "void main(){\n"
15276 " gl_Position = vec4(consts.x);\n"
15277 "}\n";
15278 char const *fsSource =
15279 "#version 450\n"
15280 "\n"
15281 "layout(location=0) out vec4 x;\n"
15282 "void main(){\n"
15283 " x = vec4(1);\n"
15284 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015285
15286 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15287 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15288
15289 VkPipelineObj pipe(m_device);
15290 pipe.AddShader(&vs);
15291 pipe.AddShader(&fs);
15292
15293 /* set up CB 0; type is UNORM by default */
15294 pipe.AddColorAttachment();
15295 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15296
15297 VkDescriptorSetObj descriptorSet(m_device);
15298 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15299
15300 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15301
15302 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015303 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015304}
15305
Chris Forbes3fb17902016-08-22 14:57:55 +120015306TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015307 TEST_DESCRIPTION(
15308 "Test that an error is produced for a shader consuming an input attachment "
15309 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15311 "consumes input attachment index 0 but not provided in subpass");
15312
Tony Barbour1fa09702017-03-16 12:09:08 -060015313 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015314
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015315 char const *vsSource =
15316 "#version 450\n"
15317 "\n"
15318 "out gl_PerVertex {\n"
15319 " vec4 gl_Position;\n"
15320 "};\n"
15321 "void main(){\n"
15322 " gl_Position = vec4(1);\n"
15323 "}\n";
15324 char const *fsSource =
15325 "#version 450\n"
15326 "\n"
15327 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15328 "layout(location=0) out vec4 color;\n"
15329 "void main() {\n"
15330 " color = subpassLoad(x);\n"
15331 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015332
15333 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15334 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15335
15336 VkPipelineObj pipe(m_device);
15337 pipe.AddShader(&vs);
15338 pipe.AddShader(&fs);
15339 pipe.AddColorAttachment();
15340 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15341
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015342 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15343 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015344 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015345 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015346 ASSERT_VK_SUCCESS(err);
15347
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015348 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015349 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015350 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015351 ASSERT_VK_SUCCESS(err);
15352
15353 // error here.
15354 pipe.CreateVKPipeline(pl, renderPass());
15355
15356 m_errorMonitor->VerifyFound();
15357
15358 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15359 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15360}
15361
Chris Forbes5a9a0472016-08-22 16:02:09 +120015362TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015363 TEST_DESCRIPTION(
15364 "Test that an error is produced for a shader consuming an input attachment "
15365 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15367 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15368
Tony Barbour1fa09702017-03-16 12:09:08 -060015369 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015370
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015371 char const *vsSource =
15372 "#version 450\n"
15373 "\n"
15374 "out gl_PerVertex {\n"
15375 " vec4 gl_Position;\n"
15376 "};\n"
15377 "void main(){\n"
15378 " gl_Position = vec4(1);\n"
15379 "}\n";
15380 char const *fsSource =
15381 "#version 450\n"
15382 "\n"
15383 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15384 "layout(location=0) out vec4 color;\n"
15385 "void main() {\n"
15386 " color = subpassLoad(x);\n"
15387 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015388
15389 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15390 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15391
15392 VkPipelineObj pipe(m_device);
15393 pipe.AddShader(&vs);
15394 pipe.AddShader(&fs);
15395 pipe.AddColorAttachment();
15396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15397
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015398 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15399 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015400 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015401 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015402 ASSERT_VK_SUCCESS(err);
15403
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015404 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015405 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015406 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015407 ASSERT_VK_SUCCESS(err);
15408
15409 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015410 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15411 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15412 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15413 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15414 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 +120015415 };
15416 VkAttachmentReference color = {
15417 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15418 };
15419 VkAttachmentReference input = {
15420 1, VK_IMAGE_LAYOUT_GENERAL,
15421 };
15422
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015423 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015424
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015425 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015426 VkRenderPass rp;
15427 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15428 ASSERT_VK_SUCCESS(err);
15429
15430 // error here.
15431 pipe.CreateVKPipeline(pl, rp);
15432
15433 m_errorMonitor->VerifyFound();
15434
15435 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15436 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15437 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15438}
15439
Chris Forbes541f7b02016-08-22 15:30:27 +120015440TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015441 TEST_DESCRIPTION(
15442 "Test that an error is produced for a shader consuming an input attachment "
15443 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015445 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015446
Tony Barbour1fa09702017-03-16 12:09:08 -060015447 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015448
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015449 char const *vsSource =
15450 "#version 450\n"
15451 "\n"
15452 "out gl_PerVertex {\n"
15453 " vec4 gl_Position;\n"
15454 "};\n"
15455 "void main(){\n"
15456 " gl_Position = vec4(1);\n"
15457 "}\n";
15458 char const *fsSource =
15459 "#version 450\n"
15460 "\n"
15461 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15462 "layout(location=0) out vec4 color;\n"
15463 "void main() {\n"
15464 " color = subpassLoad(xs[0]);\n"
15465 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015466
15467 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15468 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15469
15470 VkPipelineObj pipe(m_device);
15471 pipe.AddShader(&vs);
15472 pipe.AddShader(&fs);
15473 pipe.AddColorAttachment();
15474 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15475
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015476 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15477 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015478 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015479 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015480 ASSERT_VK_SUCCESS(err);
15481
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015482 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015483 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015484 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015485 ASSERT_VK_SUCCESS(err);
15486
15487 // error here.
15488 pipe.CreateVKPipeline(pl, renderPass());
15489
15490 m_errorMonitor->VerifyFound();
15491
15492 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15493 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15494}
15495
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015496TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015497 TEST_DESCRIPTION(
15498 "Test that an error is produced for a compute pipeline consuming a "
15499 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015501
Tony Barbour1fa09702017-03-16 12:09:08 -060015502 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015503
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015504 char const *csSource =
15505 "#version 450\n"
15506 "\n"
15507 "layout(local_size_x=1) in;\n"
15508 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15509 "void main(){\n"
15510 " x = vec4(1);\n"
15511 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015512
15513 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15514
15515 VkDescriptorSetObj descriptorSet(m_device);
15516 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15517
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015518 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15519 nullptr,
15520 0,
15521 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15522 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15523 descriptorSet.GetPipelineLayout(),
15524 VK_NULL_HANDLE,
15525 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015526
15527 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015528 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015529
15530 m_errorMonitor->VerifyFound();
15531
15532 if (err == VK_SUCCESS) {
15533 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15534 }
15535}
15536
Chris Forbes22a9b092016-07-19 14:34:05 +120015537TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015538 TEST_DESCRIPTION(
15539 "Test that an error is produced for a pipeline consuming a "
15540 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15542 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015543
Tony Barbour1fa09702017-03-16 12:09:08 -060015544 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015545
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015546 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15547 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015548 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015549 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015550 ASSERT_VK_SUCCESS(err);
15551
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015552 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015553 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015554 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015555 ASSERT_VK_SUCCESS(err);
15556
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015557 char const *csSource =
15558 "#version 450\n"
15559 "\n"
15560 "layout(local_size_x=1) in;\n"
15561 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15562 "void main() {\n"
15563 " x.x = 1.0f;\n"
15564 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015565 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15566
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015567 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15568 nullptr,
15569 0,
15570 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15571 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15572 pl,
15573 VK_NULL_HANDLE,
15574 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015575
15576 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015577 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015578
15579 m_errorMonitor->VerifyFound();
15580
15581 if (err == VK_SUCCESS) {
15582 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15583 }
15584
15585 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15586 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15587}
15588
Chris Forbes50020592016-07-27 13:52:41 +120015589TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015590 TEST_DESCRIPTION(
15591 "Test that an error is produced when an image view type "
15592 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015593
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015594 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 +120015595
Tony Barbour1fa09702017-03-16 12:09:08 -060015596 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015597 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15598
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015599 char const *vsSource =
15600 "#version 450\n"
15601 "\n"
15602 "out gl_PerVertex { vec4 gl_Position; };\n"
15603 "void main() { gl_Position = vec4(0); }\n";
15604 char const *fsSource =
15605 "#version 450\n"
15606 "\n"
15607 "layout(set=0, binding=0) uniform sampler3D s;\n"
15608 "layout(location=0) out vec4 color;\n"
15609 "void main() {\n"
15610 " color = texture(s, vec3(0));\n"
15611 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015612 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15613 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15614
15615 VkPipelineObj pipe(m_device);
15616 pipe.AddShader(&vs);
15617 pipe.AddShader(&fs);
15618 pipe.AddColorAttachment();
15619
15620 VkTextureObj texture(m_device, nullptr);
15621 VkSamplerObj sampler(m_device);
15622
15623 VkDescriptorSetObj descriptorSet(m_device);
15624 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15625 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15626
15627 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15628 ASSERT_VK_SUCCESS(err);
15629
Tony Barbour552f6c02016-12-21 14:34:07 -070015630 m_commandBuffer->BeginCommandBuffer();
15631 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015632
15633 m_commandBuffer->BindPipeline(pipe);
15634 m_commandBuffer->BindDescriptorSet(descriptorSet);
15635
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015636 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015637 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015638 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015639 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15640
15641 // error produced here.
15642 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15643
15644 m_errorMonitor->VerifyFound();
15645
Tony Barbour552f6c02016-12-21 14:34:07 -070015646 m_commandBuffer->EndRenderPass();
15647 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015648}
15649
Chris Forbes5533bfc2016-07-27 14:12:34 +120015650TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015651 TEST_DESCRIPTION(
15652 "Test that an error is produced when a multisampled images "
15653 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015654
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015656
Tony Barbour1fa09702017-03-16 12:09:08 -060015657 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15659
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015660 char const *vsSource =
15661 "#version 450\n"
15662 "\n"
15663 "out gl_PerVertex { vec4 gl_Position; };\n"
15664 "void main() { gl_Position = vec4(0); }\n";
15665 char const *fsSource =
15666 "#version 450\n"
15667 "\n"
15668 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15669 "layout(location=0) out vec4 color;\n"
15670 "void main() {\n"
15671 " color = texelFetch(s, ivec2(0), 0);\n"
15672 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015673 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15674 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15675
15676 VkPipelineObj pipe(m_device);
15677 pipe.AddShader(&vs);
15678 pipe.AddShader(&fs);
15679 pipe.AddColorAttachment();
15680
15681 VkTextureObj texture(m_device, nullptr);
15682 VkSamplerObj sampler(m_device);
15683
15684 VkDescriptorSetObj descriptorSet(m_device);
15685 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15686 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15687
15688 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15689 ASSERT_VK_SUCCESS(err);
15690
Tony Barbour552f6c02016-12-21 14:34:07 -070015691 m_commandBuffer->BeginCommandBuffer();
15692 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015693
15694 m_commandBuffer->BindPipeline(pipe);
15695 m_commandBuffer->BindDescriptorSet(descriptorSet);
15696
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015697 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015698 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015699 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015700 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15701
15702 // error produced here.
15703 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15704
15705 m_errorMonitor->VerifyFound();
15706
Tony Barbour552f6c02016-12-21 14:34:07 -070015707 m_commandBuffer->EndRenderPass();
15708 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015709}
15710
Mark Youngc48c4c12016-04-11 14:26:49 -060015711TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015712 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015713
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015714 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15715 {
15716 VkFormatProperties properties;
15717 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15718 if (properties.optimalTilingFeatures == 0) {
15719 printf(" Image format not supported; skipped.\n");
15720 return;
15721 }
15722 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015723
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015724 VkImageCreateInfo info = {};
15725 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15726 info.pNext = NULL;
15727 info.imageType = VK_IMAGE_TYPE_2D;
15728 info.format = format;
15729 info.extent.height = 32;
15730 info.extent.depth = 1;
15731 info.mipLevels = 1;
15732 info.arrayLayers = 1;
15733 info.samples = VK_SAMPLE_COUNT_1_BIT;
15734 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15735 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15736 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015737
15738 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015739 {
15740 VkImageFormatProperties properties;
15741 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15742 info.tiling, info.usage, info.flags, &properties);
15743 ASSERT_VK_SUCCESS(result);
15744 info.extent.width = properties.maxExtent.width + 1;
15745 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015746
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015747 VkImage image;
15748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15749 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015750 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015751}
15752
Mark Youngc48c4c12016-04-11 14:26:49 -060015753TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015754 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015755
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015756 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15757 {
15758 VkFormatProperties properties;
15759 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15760 if (properties.optimalTilingFeatures == 0) {
15761 printf(" Image format not supported; skipped.\n");
15762 return;
15763 }
15764 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015765
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015766 VkImageCreateInfo info = {};
15767 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15768 info.pNext = NULL;
15769 info.imageType = VK_IMAGE_TYPE_2D;
15770 info.format = format;
15771 info.extent.height = 32;
15772 info.extent.depth = 1;
15773 info.mipLevels = 1;
15774 info.arrayLayers = 1;
15775 info.samples = VK_SAMPLE_COUNT_1_BIT;
15776 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15777 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15778 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015779
15780 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015781 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015782
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015783 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060015784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015785 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15786 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015787 m_errorMonitor->VerifyFound();
15788}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015789
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015790TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015791 TEST_DESCRIPTION(
15792 "Create a render pass with an attachment description "
15793 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015794
Tony Barbour1fa09702017-03-16 12:09:08 -060015795 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015796 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15797
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015799
15800 VkAttachmentReference color_attach = {};
15801 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15802 color_attach.attachment = 0;
15803 VkSubpassDescription subpass = {};
15804 subpass.colorAttachmentCount = 1;
15805 subpass.pColorAttachments = &color_attach;
15806
15807 VkRenderPassCreateInfo rpci = {};
15808 rpci.subpassCount = 1;
15809 rpci.pSubpasses = &subpass;
15810 rpci.attachmentCount = 1;
15811 VkAttachmentDescription attach_desc = {};
15812 attach_desc.format = VK_FORMAT_UNDEFINED;
15813 rpci.pAttachments = &attach_desc;
15814 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15815 VkRenderPass rp;
15816 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15817
15818 m_errorMonitor->VerifyFound();
15819
15820 if (result == VK_SUCCESS) {
15821 vkDestroyRenderPass(m_device->device(), rp, NULL);
15822 }
15823}
15824
Karl Schultz6addd812016-02-02 17:17:23 -070015825TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015826 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015827
Mike Stroyana3082432015-09-25 13:39:21 -060015828 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015829 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15830 const int32_t tex_width = 32;
15831 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015832
15833 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015834 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15835 image_create_info.pNext = NULL;
15836 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15837 image_create_info.format = tex_format;
15838 image_create_info.extent.width = tex_width;
15839 image_create_info.extent.height = tex_height;
15840 image_create_info.extent.depth = 1;
15841 image_create_info.mipLevels = 1;
15842 image_create_info.arrayLayers = 1;
15843 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15844 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15845 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15846 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015847
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015848 VkImage image;
15849 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015850 ASSERT_VK_SUCCESS(err);
15851
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015852 VkMemoryRequirements requirements;
15853 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15854
15855 VkMemoryAllocateInfo alloc_info{};
15856 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15857 alloc_info.pNext = NULL;
15858 alloc_info.memoryTypeIndex = 0;
15859 alloc_info.allocationSize = requirements.size;
15860 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15861 ASSERT_TRUE(pass);
15862
15863 VkDeviceMemory memory;
15864 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15865 ASSERT_VK_SUCCESS(err);
15866
15867 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15868
Tobin Ehliscde08892015-09-22 10:11:37 -060015869 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015870 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015871 image_view_create_info.image = image;
15872 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15873 image_view_create_info.format = tex_format;
15874 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015875 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015876 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015877 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015878
15879 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015881 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015882 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015883
15884 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015885 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015886}
Mike Stroyana3082432015-09-25 13:39:21 -060015887
Mark Youngd339ba32016-05-30 13:28:35 -060015888TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15889 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015891 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015892
Tony Barbour1fa09702017-03-16 12:09:08 -060015893 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015894
15895 // Create an image and try to create a view with no memory backing the image
15896 VkImage image;
15897
15898 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15899 const int32_t tex_width = 32;
15900 const int32_t tex_height = 32;
15901
15902 VkImageCreateInfo image_create_info = {};
15903 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15904 image_create_info.pNext = NULL;
15905 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15906 image_create_info.format = tex_format;
15907 image_create_info.extent.width = tex_width;
15908 image_create_info.extent.height = tex_height;
15909 image_create_info.extent.depth = 1;
15910 image_create_info.mipLevels = 1;
15911 image_create_info.arrayLayers = 1;
15912 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15913 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15914 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15915 image_create_info.flags = 0;
15916
15917 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15918 ASSERT_VK_SUCCESS(err);
15919
15920 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015921 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015922 image_view_create_info.image = image;
15923 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15924 image_view_create_info.format = tex_format;
15925 image_view_create_info.subresourceRange.layerCount = 1;
15926 image_view_create_info.subresourceRange.baseMipLevel = 0;
15927 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015928 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015929
15930 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015931 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015932
15933 m_errorMonitor->VerifyFound();
15934 vkDestroyImage(m_device->device(), image, NULL);
15935 // If last error is success, it still created the view, so delete it.
15936 if (err == VK_SUCCESS) {
15937 vkDestroyImageView(m_device->device(), view, NULL);
15938 }
Mark Youngd339ba32016-05-30 13:28:35 -060015939}
15940
Karl Schultz6addd812016-02-02 17:17:23 -070015941TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015942 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015944
Tony Barbour1fa09702017-03-16 12:09:08 -060015945 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015946
Karl Schultz6addd812016-02-02 17:17:23 -070015947 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015948 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015949 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015950 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015951
15952 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015953 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015954 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015955 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15956 image_view_create_info.format = tex_format;
15957 image_view_create_info.subresourceRange.baseMipLevel = 0;
15958 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015959 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015960 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015961 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015962
15963 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015964 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015965
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015966 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015967}
15968
Mike Weiblena1e13f42017-02-09 21:25:59 -070015969TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15970 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15971
Tony Barbour1fa09702017-03-16 12:09:08 -060015972 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015973 VkSubresourceLayout subres_layout = {};
15974
15975 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15976 {
15977 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15978 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015979 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015980 ASSERT_TRUE(img.initialized());
15981
15982 VkImageSubresource subres = {};
15983 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15984 subres.mipLevel = 0;
15985 subres.arrayLayer = 0;
15986
15987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15988 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15989 m_errorMonitor->VerifyFound();
15990 }
15991
15992 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15993 {
15994 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015995 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015996 ASSERT_TRUE(img.initialized());
15997
15998 VkImageSubresource subres = {};
15999 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
16000 subres.mipLevel = 0;
16001 subres.arrayLayer = 0;
16002
16003 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16005 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16006 m_errorMonitor->VerifyFound();
16007 }
16008
16009 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16010 {
16011 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016012 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016013 ASSERT_TRUE(img.initialized());
16014
16015 VkImageSubresource subres = {};
16016 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16017 subres.mipLevel = 1; // ERROR: triggers VU 00739
16018 subres.arrayLayer = 0;
16019
16020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16021 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16022 m_errorMonitor->VerifyFound();
16023 }
16024
16025 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16026 {
16027 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016028 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016029 ASSERT_TRUE(img.initialized());
16030
16031 VkImageSubresource subres = {};
16032 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16033 subres.mipLevel = 0;
16034 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16035
16036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16037 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16038 m_errorMonitor->VerifyFound();
16039 }
16040}
16041
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016042TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016043 VkResult err;
16044 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016045
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016047
Tony Barbour1fa09702017-03-16 12:09:08 -060016048 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016049
16050 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016051 VkImage srcImage;
16052 VkImage dstImage;
16053 VkDeviceMemory srcMem;
16054 VkDeviceMemory destMem;
16055 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016056
16057 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016058 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16059 image_create_info.pNext = NULL;
16060 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16061 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16062 image_create_info.extent.width = 32;
16063 image_create_info.extent.height = 32;
16064 image_create_info.extent.depth = 1;
16065 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016066 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016067 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16068 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16069 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16070 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016071
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016072 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016073 ASSERT_VK_SUCCESS(err);
16074
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016075 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016076 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016077 ASSERT_VK_SUCCESS(err);
16078
16079 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016080 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016081 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16082 memAlloc.pNext = NULL;
16083 memAlloc.allocationSize = 0;
16084 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016085
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016086 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016087 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016088 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016089 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016090 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016091 ASSERT_VK_SUCCESS(err);
16092
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016093 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016094 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016095 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016096 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016097 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016098 ASSERT_VK_SUCCESS(err);
16099
16100 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16101 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016102 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016103 ASSERT_VK_SUCCESS(err);
16104
Tony Barbour552f6c02016-12-21 14:34:07 -070016105 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016106 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016107 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016108 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016109 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016110 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016111 copyRegion.srcOffset.x = 0;
16112 copyRegion.srcOffset.y = 0;
16113 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016114 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016115 copyRegion.dstSubresource.mipLevel = 0;
16116 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016117 // Introduce failure by forcing the dst layerCount to differ from src
16118 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016119 copyRegion.dstOffset.x = 0;
16120 copyRegion.dstOffset.y = 0;
16121 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016122 copyRegion.extent.width = 1;
16123 copyRegion.extent.height = 1;
16124 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016125 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016126 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016127
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016128 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016129
Chia-I Wuf7458c52015-10-26 21:10:41 +080016130 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016131 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016132 vkFreeMemory(m_device->device(), srcMem, NULL);
16133 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016134}
16135
Tony Barbourd6673642016-05-05 14:46:39 -060016136TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016137 TEST_DESCRIPTION("Creating images with unsuported formats ");
16138
Tony Barbour1fa09702017-03-16 12:09:08 -060016139 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016140 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016141
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016142 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016143 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016144 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016145 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16146 image_create_info.format = VK_FORMAT_UNDEFINED;
16147 image_create_info.extent.width = 32;
16148 image_create_info.extent.height = 32;
16149 image_create_info.extent.depth = 1;
16150 image_create_info.mipLevels = 1;
16151 image_create_info.arrayLayers = 1;
16152 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16153 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16154 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016155
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16157 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016158
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016159 VkImage image;
16160 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016161 m_errorMonitor->VerifyFound();
16162
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016163 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016164 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016165 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16166 VkFormat format = static_cast<VkFormat>(f);
16167 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016168 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016169 unsupported = format;
16170 break;
16171 }
16172 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016173
Tony Barbourd6673642016-05-05 14:46:39 -060016174 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016175 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016177
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016178 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016179 m_errorMonitor->VerifyFound();
16180 }
16181}
16182
16183TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016184 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16185
Tony Barbour1fa09702017-03-16 12:09:08 -060016186 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016187 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016188 if (!depth_format) {
16189 return;
16190 }
Tony Barbourd6673642016-05-05 14:46:39 -060016191
16192 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016193 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 -060016194 VK_IMAGE_TILING_OPTIMAL, 0);
16195 ASSERT_TRUE(image.initialized());
16196
16197 VkImageView imgView;
16198 VkImageViewCreateInfo imgViewInfo = {};
16199 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16200 imgViewInfo.image = image.handle();
16201 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16202 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16203 imgViewInfo.subresourceRange.layerCount = 1;
16204 imgViewInfo.subresourceRange.baseMipLevel = 0;
16205 imgViewInfo.subresourceRange.levelCount = 1;
16206 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16207
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016208 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016209 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016211 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16212 m_errorMonitor->VerifyFound();
16213 imgViewInfo.subresourceRange.baseMipLevel = 0;
16214
Tony Barbourd6673642016-05-05 14:46:39 -060016215 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16216 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016218 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16219 m_errorMonitor->VerifyFound();
16220 imgViewInfo.subresourceRange.levelCount = 1;
16221
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016222 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16223 imgViewInfo.subresourceRange.levelCount = 2;
16224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16225 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16226 m_errorMonitor->VerifyFound();
16227 imgViewInfo.subresourceRange.levelCount = 1;
16228
16229 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16230 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16232 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16233 m_errorMonitor->VerifyFound();
16234 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16235
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016236 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16237 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016238 m_errorMonitor->SetDesiredFailureMsg(
16239 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16240 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016241 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16242 m_errorMonitor->VerifyFound();
16243 imgViewInfo.subresourceRange.layerCount = 1;
16244
Tony Barbourd6673642016-05-05 14:46:39 -060016245 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016246 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016247 m_errorMonitor->SetDesiredFailureMsg(
16248 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16249 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016250 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16251 m_errorMonitor->VerifyFound();
16252 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16253
Tony Barbourd6673642016-05-05 14:46:39 -060016254 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16255 // VIEW_CREATE_ERROR
16256 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016258 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16259 m_errorMonitor->VerifyFound();
16260 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16261
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016262 // TODO: Update framework to easily passing mutable flag into ImageObj init
16263 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016264 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16265 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16266 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016267 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16268 // VIEW_CREATE_ERROR
16269 VkImageCreateInfo mutImgInfo = image.create_info();
16270 VkImage mutImage;
16271 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016272 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016273 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16274 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016275 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016276 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016277
16278 VkMemoryRequirements requirements;
16279 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16280
16281 VkMemoryAllocateInfo alloc_info{};
16282 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16283 alloc_info.pNext = NULL;
16284 alloc_info.memoryTypeIndex = 0;
16285 alloc_info.allocationSize = requirements.size;
16286 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16287 ASSERT_TRUE(pass);
16288
16289 VkDeviceMemory memory;
16290 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16291 ASSERT_VK_SUCCESS(ret);
16292
16293 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16294 ASSERT_VK_SUCCESS(ret);
16295
Tony Barbourd6673642016-05-05 14:46:39 -060016296 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016298 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16299 m_errorMonitor->VerifyFound();
16300 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016301
16302 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016303 vkDestroyImage(m_device->handle(), mutImage, NULL);
16304}
16305
Dave Houlton75967fc2017-03-06 17:21:16 -070016306TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16307 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16308
Tony Barbour1fa09702017-03-16 12:09:08 -060016309 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016310
Jamie Madill35127872017-03-15 16:17:46 -040016311 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016312 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16313 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16314 if (device_features.textureCompressionBC) {
16315 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16316 } else if (device_features.textureCompressionETC2) {
16317 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16318 } else if (device_features.textureCompressionASTC_LDR) {
16319 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16320 } else {
16321 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16322 return;
16323 }
16324
16325 VkImageCreateInfo ci;
16326 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16327 ci.pNext = NULL;
16328 ci.flags = 0;
16329 ci.imageType = VK_IMAGE_TYPE_2D;
16330 ci.format = compressed_format;
16331 ci.extent = {32, 32, 1};
16332 ci.mipLevels = 6;
16333 ci.arrayLayers = 1;
16334 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16335 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16336 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16337 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16338 ci.queueFamilyIndexCount = 0;
16339 ci.pQueueFamilyIndices = NULL;
16340 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16341
16342 VkImageObj image(m_device);
16343 image.init(&ci);
16344 ASSERT_TRUE(image.initialized());
16345
16346 VkImageObj odd_image(m_device);
16347 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16348 odd_image.init(&ci);
16349 ASSERT_TRUE(odd_image.initialized());
16350
16351 // Allocate buffers
16352 VkMemoryPropertyFlags reqs = 0;
16353 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16354 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16355 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16356 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16357 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16358
16359 VkBufferImageCopy region = {};
16360 region.bufferRowLength = 0;
16361 region.bufferImageHeight = 0;
16362 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16363 region.imageSubresource.layerCount = 1;
16364 region.imageOffset = {0, 0, 0};
16365 region.bufferOffset = 0;
16366
16367 // start recording
16368 m_commandBuffer->BeginCommandBuffer();
16369
16370 // Mip level copies that work - 5 levels
16371 m_errorMonitor->ExpectSuccess();
16372
16373 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16374 region.imageExtent = {32, 32, 1};
16375 region.imageSubresource.mipLevel = 0;
16376 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16377 &region);
16378 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16379 &region);
16380
16381 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16382 region.imageExtent = {8, 8, 1};
16383 region.imageSubresource.mipLevel = 2;
16384 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16385 &region);
16386 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16387 &region);
16388
16389 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16390 region.imageExtent = {4, 4, 1};
16391 region.imageSubresource.mipLevel = 3;
16392 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16393 &region);
16394 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16395 &region);
16396
16397 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16398 region.imageExtent = {2, 2, 1};
16399 region.imageSubresource.mipLevel = 4;
16400 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16401 &region);
16402 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16403 &region);
16404
16405 region.imageExtent = {1, 1, 1};
16406 region.imageSubresource.mipLevel = 5;
16407 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16408 &region);
16409 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16410 &region);
16411 m_errorMonitor->VerifyNotFound();
16412
16413 // Buffer must accomodate a full compressed block, regardless of texel count
16414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16415 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16416 &region);
16417 m_errorMonitor->VerifyFound();
16418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16419 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16420 &region);
16421 m_errorMonitor->VerifyFound();
16422
16423 // Copy width < compressed block size, but not the full mip width
16424 region.imageExtent = {1, 2, 1};
16425 region.imageSubresource.mipLevel = 4;
16426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16427 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16428 &region);
16429 m_errorMonitor->VerifyFound();
16430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16431 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16432 &region);
16433 m_errorMonitor->VerifyFound();
16434
16435 // Copy height < compressed block size but not the full mip height
16436 region.imageExtent = {2, 1, 1};
16437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16438 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16439 &region);
16440 m_errorMonitor->VerifyFound();
16441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16442 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16443 &region);
16444 m_errorMonitor->VerifyFound();
16445
16446 // Offsets must be multiple of compressed block size
16447 region.imageOffset = {1, 1, 0};
16448 region.imageExtent = {1, 1, 1};
16449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16450 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16451 &region);
16452 m_errorMonitor->VerifyFound();
16453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16454 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16455 &region);
16456 m_errorMonitor->VerifyFound();
16457
16458 // Offset + extent width = mip width - should succeed
16459 region.imageOffset = {4, 4, 0};
16460 region.imageExtent = {3, 4, 1};
16461 region.imageSubresource.mipLevel = 2;
16462 m_errorMonitor->ExpectSuccess();
16463 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16464 &region);
16465 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16466 &region);
16467 m_errorMonitor->VerifyNotFound();
16468
16469 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16470 region.imageExtent = {4, 4, 1};
16471 m_errorMonitor->ExpectSuccess();
16472 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16473 &region);
16474 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16475 &region);
16476 m_errorMonitor->VerifyNotFound();
16477
16478 // Offset + extent width < mip width and not a multiple of block width - should fail
16479 region.imageExtent = {3, 3, 1};
16480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16481 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16482 &region);
16483 m_errorMonitor->VerifyFound();
16484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16485 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16486 &region);
16487 m_errorMonitor->VerifyFound();
16488}
16489
Dave Houlton59a20702017-02-02 17:26:23 -070016490TEST_F(VkLayerTest, ImageBufferCopyTests) {
16491 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16492
Tony Barbour1fa09702017-03-16 12:09:08 -060016493 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016494 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16495 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16496 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16497 return;
16498 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016499
16500 // Bail if any dimension of transfer granularity is 0.
16501 auto index = m_device->graphics_queue_node_index_;
16502 auto queue_family_properties = m_device->phy().queue_properties();
16503 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16504 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16505 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16506 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16507 return;
16508 }
16509
Dave Houlton59a20702017-02-02 17:26:23 -070016510 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16511 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16512 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016513 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16514 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16515 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16516 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16517
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016518 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016519 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16520 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016521 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016522 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16523 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016524 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 -070016525 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016526 ASSERT_TRUE(image_64k.initialized());
16527 ASSERT_TRUE(image_16k.initialized());
16528 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016529
Dave Houltonf3229d52017-02-21 15:59:08 -070016530 // Verify all needed Depth/Stencil formats are supported
16531 bool missing_ds_support = false;
16532 VkFormatProperties props = {0, 0, 0};
16533 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16534 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16535 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16536 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16537 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16538 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16539 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16540 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16541
16542 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016543 ds_image_4D_1S.Init(
16544 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016545 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16546 VK_IMAGE_TILING_OPTIMAL, 0);
16547 ASSERT_TRUE(ds_image_4D_1S.initialized());
16548
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016549 ds_image_3D_1S.Init(
16550 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016551 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16552 VK_IMAGE_TILING_OPTIMAL, 0);
16553 ASSERT_TRUE(ds_image_3D_1S.initialized());
16554
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016555 ds_image_2D.Init(
16556 256, 256, 1, VK_FORMAT_D16_UNORM,
16557 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16558 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016559 ASSERT_TRUE(ds_image_2D.initialized());
16560
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016561 ds_image_1S.Init(
16562 256, 256, 1, VK_FORMAT_S8_UINT,
16563 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16564 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016565 ASSERT_TRUE(ds_image_1S.initialized());
16566 }
16567
16568 // Allocate buffers
16569 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016570 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016571 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16572 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16573 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16574 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016575
16576 VkBufferImageCopy region = {};
16577 region.bufferRowLength = 0;
16578 region.bufferImageHeight = 0;
16579 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16580 region.imageSubresource.layerCount = 1;
16581 region.imageOffset = {0, 0, 0};
16582 region.imageExtent = {64, 64, 1};
16583 region.bufferOffset = 0;
16584
16585 // attempt copies before putting command buffer in recording state
16586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16587 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16588 &region);
16589 m_errorMonitor->VerifyFound();
16590
16591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16592 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16593 &region);
16594 m_errorMonitor->VerifyFound();
16595
16596 // start recording
16597 m_commandBuffer->BeginCommandBuffer();
16598
16599 // successful copies
16600 m_errorMonitor->ExpectSuccess();
16601 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16602 &region);
16603 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16604 &region);
16605 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16606 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16607 &region);
16608 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16609 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16610 &region);
16611 region.imageOffset.x = 0;
16612 region.imageExtent.height = 64;
16613 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16614 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16615 &region);
16616 m_errorMonitor->VerifyNotFound();
16617
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016618 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016619 region.imageExtent = {65, 64, 1};
16620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16621 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16622 &region);
16623 m_errorMonitor->VerifyFound();
16624
16625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16626 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16627 &region);
16628 m_errorMonitor->VerifyFound();
16629
16630 // image/buffer too small (offset) on copy to image
16631 region.imageExtent = {64, 64, 1};
16632 region.imageOffset = {0, 4, 0};
16633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16634 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16635 &region);
16636 m_errorMonitor->VerifyFound();
16637
16638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16639 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16640 &region);
16641 m_errorMonitor->VerifyFound();
16642
16643 // image/buffer too small on copy to buffer
16644 region.imageExtent = {64, 64, 1};
16645 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016646 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16648 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16649 &region);
16650 m_errorMonitor->VerifyFound();
16651
16652 region.imageExtent = {64, 65, 1};
16653 region.bufferOffset = 0;
16654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16655 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16656 &region);
16657 m_errorMonitor->VerifyFound();
16658
16659 // buffer size ok but rowlength causes loose packing
16660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16661 region.imageExtent = {64, 64, 1};
16662 region.bufferRowLength = 68;
16663 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16664 &region);
16665 m_errorMonitor->VerifyFound();
16666
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016667 // An extent with zero area should produce a warning, but no error
16668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16669 region.imageExtent.width = 0;
16670 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16671 &region);
16672 m_errorMonitor->VerifyFound();
16673
Dave Houlton59a20702017-02-02 17:26:23 -070016674 // aspect bits
16675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16676 region.imageExtent = {64, 64, 1};
16677 region.bufferRowLength = 0;
16678 region.bufferImageHeight = 0;
16679 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16680 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16681 buffer_16k.handle(), 1, &region);
16682 m_errorMonitor->VerifyFound();
16683
16684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16685 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16686 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16687 &region);
16688 m_errorMonitor->VerifyFound();
16689
16690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16691 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16692 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16693 buffer_16k.handle(), 1, &region);
16694 m_errorMonitor->VerifyFound();
16695
Dave Houltonf3229d52017-02-21 15:59:08 -070016696 // Test Depth/Stencil copies
16697 if (missing_ds_support) {
16698 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16699 } else {
16700 VkBufferImageCopy ds_region = {};
16701 ds_region.bufferOffset = 0;
16702 ds_region.bufferRowLength = 0;
16703 ds_region.bufferImageHeight = 0;
16704 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16705 ds_region.imageSubresource.mipLevel = 0;
16706 ds_region.imageSubresource.baseArrayLayer = 0;
16707 ds_region.imageSubresource.layerCount = 1;
16708 ds_region.imageOffset = {0, 0, 0};
16709 ds_region.imageExtent = {256, 256, 1};
16710
16711 // Depth copies that should succeed
16712 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16713 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16714 buffer_256k.handle(), 1, &ds_region);
16715 m_errorMonitor->VerifyNotFound();
16716
16717 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16718 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16719 buffer_256k.handle(), 1, &ds_region);
16720 m_errorMonitor->VerifyNotFound();
16721
16722 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16723 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16724 buffer_128k.handle(), 1, &ds_region);
16725 m_errorMonitor->VerifyNotFound();
16726
16727 // Depth copies that should fail
16728 ds_region.bufferOffset = 4;
16729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16730 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16731 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16732 buffer_256k.handle(), 1, &ds_region);
16733 m_errorMonitor->VerifyFound();
16734
16735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16736 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16737 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16738 buffer_256k.handle(), 1, &ds_region);
16739 m_errorMonitor->VerifyFound();
16740
16741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16742 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16743 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16744 buffer_128k.handle(), 1, &ds_region);
16745 m_errorMonitor->VerifyFound();
16746
16747 // Stencil copies that should succeed
16748 ds_region.bufferOffset = 0;
16749 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16750 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16751 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16752 buffer_64k.handle(), 1, &ds_region);
16753 m_errorMonitor->VerifyNotFound();
16754
16755 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16756 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16757 buffer_64k.handle(), 1, &ds_region);
16758 m_errorMonitor->VerifyNotFound();
16759
16760 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16761 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16762 buffer_64k.handle(), 1, &ds_region);
16763 m_errorMonitor->VerifyNotFound();
16764
16765 // Stencil copies that should fail
16766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16767 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16768 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16769 buffer_16k.handle(), 1, &ds_region);
16770 m_errorMonitor->VerifyFound();
16771
16772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16773 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16774 ds_region.bufferRowLength = 260;
16775 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16776 buffer_64k.handle(), 1, &ds_region);
16777 m_errorMonitor->VerifyFound();
16778
16779 ds_region.bufferRowLength = 0;
16780 ds_region.bufferOffset = 4;
16781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16782 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16783 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16784 buffer_64k.handle(), 1, &ds_region);
16785 m_errorMonitor->VerifyFound();
16786 }
16787
Dave Houlton584d51e2017-02-16 12:52:54 -070016788 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016789 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016790 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016791 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16792 device_features.textureCompressionASTC_LDR)) {
16793 printf(" No compressed formats supported - block compression tests skipped.\n");
16794 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016795 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16796 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016797 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016798 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16799 0);
16800 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 -070016801 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016802 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016803 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 -070016804 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016805 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 -070016806 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016807 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016808 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 -070016809 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016810 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 -070016811 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016812 }
16813 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016814
Dave Houlton584d51e2017-02-16 12:52:54 -070016815 // Just fits
16816 m_errorMonitor->ExpectSuccess();
16817 region.imageExtent = {128, 128, 1};
16818 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16819 buffer_16k.handle(), 1, &region);
16820 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016821
Dave Houlton584d51e2017-02-16 12:52:54 -070016822 // with offset, too big for buffer
16823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16824 region.bufferOffset = 16;
16825 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16826 buffer_16k.handle(), 1, &region);
16827 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016828 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016829
Dave Houlton67e9b532017-03-02 17:00:10 -070016830 // extents that are not a multiple of compressed block size
16831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16832 region.imageExtent.width = 66;
16833 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16834 buffer_16k.handle(), 1, &region);
16835 m_errorMonitor->VerifyFound();
16836 region.imageExtent.width = 128;
16837
16838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016839 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016840 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16841 buffer_16k.handle(), 1, &region);
16842 m_errorMonitor->VerifyFound();
16843 region.imageExtent.height = 128;
16844
16845 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16846
16847 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16848 m_errorMonitor->ExpectSuccess();
16849 region.imageExtent.width = 66;
16850 region.imageOffset.x = 64;
16851 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16852 buffer_16k.handle(), 1, &region);
16853 region.imageExtent.width = 16;
16854 region.imageOffset.x = 0;
16855 region.imageExtent.height = 2;
16856 region.imageOffset.y = 128;
16857 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016858 buffer_16k.handle(), 1, &region);
16859 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016860 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016861
Dave Houlton584d51e2017-02-16 12:52:54 -070016862 // buffer offset must be a multiple of texel block size (16)
16863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16865 region.imageExtent = {64, 64, 1};
16866 region.bufferOffset = 24;
16867 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16868 buffer_16k.handle(), 1, &region);
16869 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016870
Dave Houlton584d51e2017-02-16 12:52:54 -070016871 // rowlength not a multiple of block width (4)
16872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16873 region.bufferOffset = 0;
16874 region.bufferRowLength = 130;
16875 region.bufferImageHeight = 0;
16876 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16877 buffer_64k.handle(), 1, &region);
16878 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016879
Dave Houlton584d51e2017-02-16 12:52:54 -070016880 // imageheight not a multiple of block height (4)
16881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16882 region.bufferRowLength = 0;
16883 region.bufferImageHeight = 130;
16884 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16885 buffer_64k.handle(), 1, &region);
16886 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016887 }
Dave Houlton59a20702017-02-02 17:26:23 -070016888}
16889
Tony Barbourd6673642016-05-05 14:46:39 -060016890TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016891 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016892
Tony Barbour1fa09702017-03-16 12:09:08 -060016893 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016894
Rene Lindsay135204f2016-12-22 17:11:09 -070016895 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016896 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016897 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 -070016898 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016899 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016900 vk_testing::Buffer buffer;
16901 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016902 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016903 VkBufferImageCopy region = {};
16904 region.bufferRowLength = 128;
16905 region.bufferImageHeight = 128;
16906 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16907 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016908 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016909 region.imageExtent.height = 4;
16910 region.imageExtent.width = 4;
16911 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016912
16913 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016914 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 -070016915 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016916 ASSERT_TRUE(image2.initialized());
16917 vk_testing::Buffer buffer2;
16918 VkMemoryPropertyFlags reqs2 = 0;
16919 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16920 VkBufferImageCopy region2 = {};
16921 region2.bufferRowLength = 128;
16922 region2.bufferImageHeight = 128;
16923 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16924 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16925 region2.imageSubresource.layerCount = 1;
16926 region2.imageExtent.height = 4;
16927 region2.imageExtent.width = 4;
16928 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016929 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016930
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016931 // Image must have offset.z of 0 and extent.depth of 1
16932 // Introduce failure by setting imageExtent.depth to 0
16933 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016935 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016936 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016937 m_errorMonitor->VerifyFound();
16938
16939 region.imageExtent.depth = 1;
16940
16941 // Image must have offset.z of 0 and extent.depth of 1
16942 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016943 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016944 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016947 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016948 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016949 m_errorMonitor->VerifyFound();
16950
16951 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016952 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16953 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016954 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016956 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16957 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016958 m_errorMonitor->VerifyFound();
16959
16960 // BufferOffset must be a multiple of 4
16961 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016962 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016964 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16965 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016966 m_errorMonitor->VerifyFound();
16967
16968 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16969 region.bufferOffset = 0;
16970 region.imageExtent.height = 128;
16971 region.imageExtent.width = 128;
16972 // Introduce failure by setting bufferRowLength > 0 but less than width
16973 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016975 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16976 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016977 m_errorMonitor->VerifyFound();
16978
16979 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16980 region.bufferRowLength = 128;
16981 // Introduce failure by setting bufferRowHeight > 0 but less than height
16982 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016984 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16985 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016986 m_errorMonitor->VerifyFound();
16987
16988 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016989 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016990 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 -070016991 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016992 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016993 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 -070016994 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016995 VkImageBlit blitRegion = {};
16996 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16997 blitRegion.srcSubresource.baseArrayLayer = 0;
16998 blitRegion.srcSubresource.layerCount = 1;
16999 blitRegion.srcSubresource.mipLevel = 0;
17000 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17001 blitRegion.dstSubresource.baseArrayLayer = 0;
17002 blitRegion.dstSubresource.layerCount = 1;
17003 blitRegion.dstSubresource.mipLevel = 0;
17004
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017005 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17007 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17009 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017010 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17011 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017012 m_errorMonitor->VerifyFound();
17013
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017015 VkImageMemoryBarrier img_barrier;
17016 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17017 img_barrier.pNext = NULL;
17018 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17019 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17020 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17021 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17022 img_barrier.image = image.handle();
17023 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17024 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17025 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17026 img_barrier.subresourceRange.baseArrayLayer = 0;
17027 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017028 img_barrier.subresourceRange.layerCount = 0;
17029 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017030 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17031 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017032 m_errorMonitor->VerifyFound();
17033 img_barrier.subresourceRange.layerCount = 1;
17034}
17035
17036TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017037 TEST_DESCRIPTION("Exceed the limits of image format ");
17038
Tony Barbour1fa09702017-03-16 12:09:08 -060017039 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017040
17041 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17042 {
17043 VkFormatProperties properties;
17044 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17045 if (properties.linearTilingFeatures == 0) {
17046 printf(" Image format not supported; skipped.\n");
17047 return;
17048 }
17049 }
17050
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017052 VkImageCreateInfo image_create_info = {};
17053 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17054 image_create_info.pNext = NULL;
17055 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017056 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017057 image_create_info.extent.width = 32;
17058 image_create_info.extent.height = 32;
17059 image_create_info.extent.depth = 1;
17060 image_create_info.mipLevels = 1;
17061 image_create_info.arrayLayers = 1;
17062 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17063 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17064 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17065 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17066 image_create_info.flags = 0;
17067
17068 VkImage nullImg;
17069 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017070 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17071 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017072 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017073 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17074 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17075 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017076 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017077
Tony Barbour0907e362017-03-09 15:05:30 -070017078 uint32_t maxDim =
17079 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17080 // If max mip levels exceeds image extents, skip the max mip levels test
17081 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17083 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17084 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17085 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17086 m_errorMonitor->VerifyFound();
17087 image_create_info.mipLevels = 1;
17088 }
Tony Barbourd6673642016-05-05 14:46:39 -060017089
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017091 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17092 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17093 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17094 m_errorMonitor->VerifyFound();
17095 image_create_info.arrayLayers = 1;
17096
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017098 int samples = imgFmtProps.sampleCounts >> 1;
17099 image_create_info.samples = (VkSampleCountFlagBits)samples;
17100 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17101 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17102 m_errorMonitor->VerifyFound();
17103 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17104
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17106 "pCreateInfo->initialLayout, must be "
17107 "VK_IMAGE_LAYOUT_UNDEFINED or "
17108 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017109 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17110 // Expect INVALID_LAYOUT
17111 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17112 m_errorMonitor->VerifyFound();
17113 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17114}
17115
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017116TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017117 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017119
Tony Barbour1fa09702017-03-16 12:09:08 -060017120 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017121
17122 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017123 src_image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017124 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017125 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017126
Tony Barbour552f6c02016-12-21 14:34:07 -070017127 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017128 VkImageCopy copy_region;
17129 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17130 copy_region.srcSubresource.mipLevel = 0;
17131 copy_region.srcSubresource.baseArrayLayer = 0;
17132 copy_region.srcSubresource.layerCount = 0;
17133 copy_region.srcOffset.x = 0;
17134 copy_region.srcOffset.y = 0;
17135 copy_region.srcOffset.z = 0;
17136 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17137 copy_region.dstSubresource.mipLevel = 0;
17138 copy_region.dstSubresource.baseArrayLayer = 0;
17139 copy_region.dstSubresource.layerCount = 0;
17140 copy_region.dstOffset.x = 0;
17141 copy_region.dstOffset.y = 0;
17142 copy_region.dstOffset.z = 0;
17143 copy_region.extent.width = 64;
17144 copy_region.extent.height = 64;
17145 copy_region.extent.depth = 1;
17146 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17147 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017148 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017149
17150 m_errorMonitor->VerifyFound();
17151}
17152
17153TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017154 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017156
Tony Barbour1fa09702017-03-16 12:09:08 -060017157 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017158
17159 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017160 src_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017161 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017162 dst_image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017163
Tony Barbour552f6c02016-12-21 14:34:07 -070017164 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017165 VkImageCopy copy_region;
17166 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17167 copy_region.srcSubresource.mipLevel = 0;
17168 copy_region.srcSubresource.baseArrayLayer = 0;
17169 copy_region.srcSubresource.layerCount = 0;
17170 copy_region.srcOffset.x = 0;
17171 copy_region.srcOffset.y = 0;
17172 copy_region.srcOffset.z = 0;
17173 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17174 copy_region.dstSubresource.mipLevel = 0;
17175 copy_region.dstSubresource.baseArrayLayer = 0;
17176 copy_region.dstSubresource.layerCount = 0;
17177 copy_region.dstOffset.x = 0;
17178 copy_region.dstOffset.y = 0;
17179 copy_region.dstOffset.z = 0;
17180 copy_region.extent.width = 64;
17181 copy_region.extent.height = 64;
17182 copy_region.extent.depth = 1;
17183 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17184 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017185 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017186
17187 m_errorMonitor->VerifyFound();
17188}
17189
Karl Schultz6addd812016-02-02 17:17:23 -070017190TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017191 VkResult err;
17192 bool pass;
17193
17194 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017196
Tony Barbour1fa09702017-03-16 12:09:08 -060017197 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017198
17199 // Create two images of different types and try to copy between them
17200 VkImage srcImage;
17201 VkImage dstImage;
17202 VkDeviceMemory srcMem;
17203 VkDeviceMemory destMem;
17204 VkMemoryRequirements memReqs;
17205
17206 VkImageCreateInfo image_create_info = {};
17207 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17208 image_create_info.pNext = NULL;
17209 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17210 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17211 image_create_info.extent.width = 32;
17212 image_create_info.extent.height = 32;
17213 image_create_info.extent.depth = 1;
17214 image_create_info.mipLevels = 1;
17215 image_create_info.arrayLayers = 1;
17216 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17217 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17218 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17219 image_create_info.flags = 0;
17220
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017221 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017222 ASSERT_VK_SUCCESS(err);
17223
17224 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17225 // Introduce failure by creating second image with a different-sized format.
17226 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017227 VkFormatProperties properties;
17228 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17229 if (properties.optimalTilingFeatures == 0) {
17230 printf(" Image format not supported; skipped.\n");
17231 return;
17232 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017233
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017234 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017235 ASSERT_VK_SUCCESS(err);
17236
17237 // Allocate memory
17238 VkMemoryAllocateInfo memAlloc = {};
17239 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17240 memAlloc.pNext = NULL;
17241 memAlloc.allocationSize = 0;
17242 memAlloc.memoryTypeIndex = 0;
17243
17244 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17245 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017246 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017247 ASSERT_TRUE(pass);
17248 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17249 ASSERT_VK_SUCCESS(err);
17250
17251 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17252 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017253 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017254 ASSERT_TRUE(pass);
17255 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17256 ASSERT_VK_SUCCESS(err);
17257
17258 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17259 ASSERT_VK_SUCCESS(err);
17260 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17261 ASSERT_VK_SUCCESS(err);
17262
Tony Barbour552f6c02016-12-21 14:34:07 -070017263 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017264 VkImageCopy copyRegion;
17265 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17266 copyRegion.srcSubresource.mipLevel = 0;
17267 copyRegion.srcSubresource.baseArrayLayer = 0;
17268 copyRegion.srcSubresource.layerCount = 0;
17269 copyRegion.srcOffset.x = 0;
17270 copyRegion.srcOffset.y = 0;
17271 copyRegion.srcOffset.z = 0;
17272 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17273 copyRegion.dstSubresource.mipLevel = 0;
17274 copyRegion.dstSubresource.baseArrayLayer = 0;
17275 copyRegion.dstSubresource.layerCount = 0;
17276 copyRegion.dstOffset.x = 0;
17277 copyRegion.dstOffset.y = 0;
17278 copyRegion.dstOffset.z = 0;
17279 copyRegion.extent.width = 1;
17280 copyRegion.extent.height = 1;
17281 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017282 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017283 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017284
17285 m_errorMonitor->VerifyFound();
17286
17287 vkDestroyImage(m_device->device(), srcImage, NULL);
17288 vkDestroyImage(m_device->device(), dstImage, NULL);
17289 vkFreeMemory(m_device->device(), srcMem, NULL);
17290 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017291}
17292
Karl Schultz6addd812016-02-02 17:17:23 -070017293TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17294 VkResult err;
17295 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017296
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017297 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17299 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017300
Tony Barbour1fa09702017-03-16 12:09:08 -060017301 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017302 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017303 if (!depth_format) {
17304 return;
17305 }
Mike Stroyana3082432015-09-25 13:39:21 -060017306
17307 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017308 VkImage srcImage;
17309 VkImage dstImage;
17310 VkDeviceMemory srcMem;
17311 VkDeviceMemory destMem;
17312 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017313
17314 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017315 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17316 image_create_info.pNext = NULL;
17317 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017318 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017319 image_create_info.extent.width = 32;
17320 image_create_info.extent.height = 32;
17321 image_create_info.extent.depth = 1;
17322 image_create_info.mipLevels = 1;
17323 image_create_info.arrayLayers = 1;
17324 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060017325 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070017326 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17327 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017328 VkFormatProperties properties;
17329 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17330 if (properties.optimalTilingFeatures == 0) {
17331 printf(" Image format not supported; skipped.\n");
17332 return;
17333 }
Mike Stroyana3082432015-09-25 13:39:21 -060017334
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017335 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017336 ASSERT_VK_SUCCESS(err);
17337
Karl Schultzbdb75952016-04-19 11:36:49 -060017338 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17339
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017340 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017341 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017342 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017343 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017345 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017346 ASSERT_VK_SUCCESS(err);
17347
17348 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017349 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017350 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17351 memAlloc.pNext = NULL;
17352 memAlloc.allocationSize = 0;
17353 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017354
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017355 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017356 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017357 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017358 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017359 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017360 ASSERT_VK_SUCCESS(err);
17361
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017362 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017363 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017364 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017365 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017366 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017367 ASSERT_VK_SUCCESS(err);
17368
17369 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17370 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017371 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017372 ASSERT_VK_SUCCESS(err);
17373
Tony Barbour552f6c02016-12-21 14:34:07 -070017374 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017375 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017376 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017377 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017378 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017379 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017380 copyRegion.srcOffset.x = 0;
17381 copyRegion.srcOffset.y = 0;
17382 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017383 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017384 copyRegion.dstSubresource.mipLevel = 0;
17385 copyRegion.dstSubresource.baseArrayLayer = 0;
17386 copyRegion.dstSubresource.layerCount = 0;
17387 copyRegion.dstOffset.x = 0;
17388 copyRegion.dstOffset.y = 0;
17389 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017390 copyRegion.extent.width = 1;
17391 copyRegion.extent.height = 1;
17392 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017393 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017394 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017395
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017396 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017397
Chia-I Wuf7458c52015-10-26 21:10:41 +080017398 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017399 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017400 vkFreeMemory(m_device->device(), srcMem, NULL);
17401 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017402}
17403
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017404TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17405 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017406
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017407 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017408
17409 VkImageFormatProperties image_format_properties;
17410 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17411 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17412 &image_format_properties);
17413
17414 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17415 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17416 printf(" Image multi-sample support not found; skipped.\n");
17417 return;
17418 }
17419
17420 VkImageCreateInfo ci;
17421 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17422 ci.pNext = NULL;
17423 ci.flags = 0;
17424 ci.imageType = VK_IMAGE_TYPE_2D;
17425 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17426 ci.extent = {128, 128, 1};
17427 ci.mipLevels = 1;
17428 ci.arrayLayers = 1;
17429 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17430 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17431 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17432 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17433 ci.queueFamilyIndexCount = 0;
17434 ci.pQueueFamilyIndices = NULL;
17435 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17436
17437 VkImageObj image1(m_device);
17438 image1.init(&ci);
17439 ASSERT_TRUE(image1.initialized());
17440
17441 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17442 VkImageObj image2(m_device);
17443 image2.init(&ci);
17444 ASSERT_TRUE(image2.initialized());
17445
17446 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17447 VkImageObj image4(m_device);
17448 image4.init(&ci);
17449 ASSERT_TRUE(image4.initialized());
17450
17451 m_commandBuffer->BeginCommandBuffer();
17452
17453 VkImageCopy copyRegion;
17454 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17455 copyRegion.srcSubresource.mipLevel = 0;
17456 copyRegion.srcSubresource.baseArrayLayer = 0;
17457 copyRegion.srcSubresource.layerCount = 1;
17458 copyRegion.srcOffset = {0, 0, 0};
17459 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17460 copyRegion.dstSubresource.mipLevel = 0;
17461 copyRegion.dstSubresource.baseArrayLayer = 0;
17462 copyRegion.dstSubresource.layerCount = 1;
17463 copyRegion.dstOffset = {0, 0, 0};
17464 copyRegion.extent = {128, 128, 1};
17465
17466 // Copy a single sample image to/from a multi-sample image
17467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17468 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17469 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17470 m_errorMonitor->VerifyFound();
17471
17472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17473 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17474 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17475 m_errorMonitor->VerifyFound();
17476
17477 // Copy between multi-sample images with different sample counts
17478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17479 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17480 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17481 m_errorMonitor->VerifyFound();
17482
17483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17484 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17485 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17486 m_errorMonitor->VerifyFound();
17487
17488 m_commandBuffer->EndCommandBuffer();
17489}
17490
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017491TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17492 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017493 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017494 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017495 if (!ds_format) {
17496 return;
17497 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017498
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017499 VkFormatProperties properties;
17500 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
17501 if (properties.optimalTilingFeatures == 0) {
17502 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
17503 return;
17504 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017505 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017506 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 -060017507 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 -060017508 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017509 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17510 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017511 ASSERT_TRUE(color_image.initialized());
17512 ASSERT_TRUE(depth_image.initialized());
17513 ASSERT_TRUE(ds_image.initialized());
17514
17515 VkImageCopy copyRegion;
17516 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17517 copyRegion.srcSubresource.mipLevel = 0;
17518 copyRegion.srcSubresource.baseArrayLayer = 0;
17519 copyRegion.srcSubresource.layerCount = 1;
17520 copyRegion.srcOffset = {0, 0, 0};
17521 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17522 copyRegion.dstSubresource.mipLevel = 0;
17523 copyRegion.dstSubresource.baseArrayLayer = 0;
17524 copyRegion.dstSubresource.layerCount = 1;
17525 copyRegion.dstOffset = {64, 0, 0};
17526 copyRegion.extent = {64, 128, 1};
17527
17528 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17530 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17531 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17532 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017533 m_errorMonitor->VerifyFound();
17534
17535 m_commandBuffer->BeginCommandBuffer();
17536
17537 // Src and dest aspect masks don't match
17538 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017540 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17541 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017542 m_errorMonitor->VerifyFound();
17543 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17544
17545 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017546 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017547 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17549 // These aspect/format mismatches are redundant but unavoidable here
17550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017552 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17553 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017554 m_errorMonitor->VerifyFound();
17555 // Metadata aspect is illegal - VU 01222
17556 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17557 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17559 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017560 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17561 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017562 m_errorMonitor->VerifyFound();
17563
17564 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17565 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17566
17567 // Aspect mask doesn't match source image format - VU 01200
17568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17569 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17571 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17572 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17573 m_errorMonitor->VerifyFound();
17574
17575 // Aspect mask doesn't match dest image format - VU 01201
17576 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17577 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17579 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17581 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17582 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17583 m_errorMonitor->VerifyFound();
17584
17585 m_commandBuffer->EndCommandBuffer();
17586}
17587
Karl Schultz6addd812016-02-02 17:17:23 -070017588TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17589 VkResult err;
17590 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017591
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17593 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017594
Tony Barbour1fa09702017-03-16 12:09:08 -060017595 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017596
17597 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017598 VkImage srcImage;
17599 VkImage dstImage;
17600 VkDeviceMemory srcMem;
17601 VkDeviceMemory destMem;
17602 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017603
17604 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017605 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17606 image_create_info.pNext = NULL;
17607 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17608 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17609 image_create_info.extent.width = 32;
17610 image_create_info.extent.height = 1;
17611 image_create_info.extent.depth = 1;
17612 image_create_info.mipLevels = 1;
17613 image_create_info.arrayLayers = 1;
17614 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17615 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17616 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17617 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017618
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017619 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017620 ASSERT_VK_SUCCESS(err);
17621
Karl Schultz6addd812016-02-02 17:17:23 -070017622 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017623
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017624 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017625 ASSERT_VK_SUCCESS(err);
17626
17627 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017628 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017629 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17630 memAlloc.pNext = NULL;
17631 memAlloc.allocationSize = 0;
17632 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017633
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017634 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017635 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017636 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017637 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017638 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017639 ASSERT_VK_SUCCESS(err);
17640
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017641 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017642 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017643 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017644 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017645 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017646 ASSERT_VK_SUCCESS(err);
17647
17648 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17649 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017650 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017651 ASSERT_VK_SUCCESS(err);
17652
Tony Barbour552f6c02016-12-21 14:34:07 -070017653 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017654 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017655 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17656 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017657 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017658 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017659 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017660 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017661 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017662 resolveRegion.srcOffset.x = 0;
17663 resolveRegion.srcOffset.y = 0;
17664 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017665 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017666 resolveRegion.dstSubresource.mipLevel = 0;
17667 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017668 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017669 resolveRegion.dstOffset.x = 0;
17670 resolveRegion.dstOffset.y = 0;
17671 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017672 resolveRegion.extent.width = 1;
17673 resolveRegion.extent.height = 1;
17674 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017675 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017676 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017677
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017678 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017679
Chia-I Wuf7458c52015-10-26 21:10:41 +080017680 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017681 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017682 vkFreeMemory(m_device->device(), srcMem, NULL);
17683 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017684}
17685
Karl Schultz6addd812016-02-02 17:17:23 -070017686TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17687 VkResult err;
17688 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017689
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17691 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017692
Tony Barbour1fa09702017-03-16 12:09:08 -060017693 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017694
Chris Forbesa7530692016-05-08 12:35:39 +120017695 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017696 VkImage srcImage;
17697 VkImage dstImage;
17698 VkDeviceMemory srcMem;
17699 VkDeviceMemory destMem;
17700 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017701
17702 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017703 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17704 image_create_info.pNext = NULL;
17705 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17706 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17707 image_create_info.extent.width = 32;
17708 image_create_info.extent.height = 1;
17709 image_create_info.extent.depth = 1;
17710 image_create_info.mipLevels = 1;
17711 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017712 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017713 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17714 // Note: Some implementations expect color attachment usage for any
17715 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017716 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017717 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017718
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017719 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017720 ASSERT_VK_SUCCESS(err);
17721
Karl Schultz6addd812016-02-02 17:17:23 -070017722 // Note: Some implementations expect color attachment usage for any
17723 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017724 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017725
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017726 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017727 ASSERT_VK_SUCCESS(err);
17728
17729 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017730 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017731 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17732 memAlloc.pNext = NULL;
17733 memAlloc.allocationSize = 0;
17734 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017735
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017736 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017737 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017738 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017739 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017740 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017741 ASSERT_VK_SUCCESS(err);
17742
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017743 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017744 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017745 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017746 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017747 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017748 ASSERT_VK_SUCCESS(err);
17749
17750 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17751 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017752 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017753 ASSERT_VK_SUCCESS(err);
17754
Tony Barbour552f6c02016-12-21 14:34:07 -070017755 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017756 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017757 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17758 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017759 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017760 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017761 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017762 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017763 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017764 resolveRegion.srcOffset.x = 0;
17765 resolveRegion.srcOffset.y = 0;
17766 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017767 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017768 resolveRegion.dstSubresource.mipLevel = 0;
17769 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017770 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017771 resolveRegion.dstOffset.x = 0;
17772 resolveRegion.dstOffset.y = 0;
17773 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017774 resolveRegion.extent.width = 1;
17775 resolveRegion.extent.height = 1;
17776 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017777 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017778 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017779
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017780 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017781
Chia-I Wuf7458c52015-10-26 21:10:41 +080017782 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017783 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017784 vkFreeMemory(m_device->device(), srcMem, NULL);
17785 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017786}
17787
Karl Schultz6addd812016-02-02 17:17:23 -070017788TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17789 VkResult err;
17790 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017791
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017793 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017794
Tony Barbour1fa09702017-03-16 12:09:08 -060017795 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017796
17797 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017798 VkImage srcImage;
17799 VkImage dstImage;
17800 VkDeviceMemory srcMem;
17801 VkDeviceMemory destMem;
17802 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017803
17804 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017805 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17806 image_create_info.pNext = NULL;
17807 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17808 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17809 image_create_info.extent.width = 32;
17810 image_create_info.extent.height = 1;
17811 image_create_info.extent.depth = 1;
17812 image_create_info.mipLevels = 1;
17813 image_create_info.arrayLayers = 1;
17814 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17815 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17816 // Note: Some implementations expect color attachment usage for any
17817 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017818 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017819 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017820
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017821 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017822 ASSERT_VK_SUCCESS(err);
17823
Karl Schultz6addd812016-02-02 17:17:23 -070017824 // Set format to something other than source image
17825 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17826 // Note: Some implementations expect color attachment usage for any
17827 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017828 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017829 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017830
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017831 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017832 ASSERT_VK_SUCCESS(err);
17833
17834 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017835 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017836 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17837 memAlloc.pNext = NULL;
17838 memAlloc.allocationSize = 0;
17839 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017840
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017841 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017842 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017843 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017844 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017845 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017846 ASSERT_VK_SUCCESS(err);
17847
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017848 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017849 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017850 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017851 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017852 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017853 ASSERT_VK_SUCCESS(err);
17854
17855 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17856 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017857 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017858 ASSERT_VK_SUCCESS(err);
17859
Tony Barbour552f6c02016-12-21 14:34:07 -070017860 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017861 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017862 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17863 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017864 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017865 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017866 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017867 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017868 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017869 resolveRegion.srcOffset.x = 0;
17870 resolveRegion.srcOffset.y = 0;
17871 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017872 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017873 resolveRegion.dstSubresource.mipLevel = 0;
17874 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017875 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017876 resolveRegion.dstOffset.x = 0;
17877 resolveRegion.dstOffset.y = 0;
17878 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017879 resolveRegion.extent.width = 1;
17880 resolveRegion.extent.height = 1;
17881 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017882 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017883 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017884
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017885 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017886
Chia-I Wuf7458c52015-10-26 21:10:41 +080017887 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017888 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017889 vkFreeMemory(m_device->device(), srcMem, NULL);
17890 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017891}
17892
Karl Schultz6addd812016-02-02 17:17:23 -070017893TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17894 VkResult err;
17895 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017896
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017898 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017899
Tony Barbour1fa09702017-03-16 12:09:08 -060017900 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017901
17902 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017903 VkImage srcImage;
17904 VkImage dstImage;
17905 VkDeviceMemory srcMem;
17906 VkDeviceMemory destMem;
17907 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017908
17909 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017910 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17911 image_create_info.pNext = NULL;
17912 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17913 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17914 image_create_info.extent.width = 32;
17915 image_create_info.extent.height = 1;
17916 image_create_info.extent.depth = 1;
17917 image_create_info.mipLevels = 1;
17918 image_create_info.arrayLayers = 1;
17919 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17920 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17921 // Note: Some implementations expect color attachment usage for any
17922 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017923 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017924 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017925
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017926 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017927 ASSERT_VK_SUCCESS(err);
17928
Karl Schultz6addd812016-02-02 17:17:23 -070017929 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17930 // Note: Some implementations expect color attachment usage for any
17931 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017932 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017933 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017934
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017935 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017936 ASSERT_VK_SUCCESS(err);
17937
17938 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017939 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017940 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17941 memAlloc.pNext = NULL;
17942 memAlloc.allocationSize = 0;
17943 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017944
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017945 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017946 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017947 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017948 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017949 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017950 ASSERT_VK_SUCCESS(err);
17951
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017952 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017953 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017954 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017955 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017956 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017957 ASSERT_VK_SUCCESS(err);
17958
17959 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17960 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017961 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017962 ASSERT_VK_SUCCESS(err);
17963
Tony Barbour552f6c02016-12-21 14:34:07 -070017964 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017965 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017966 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17967 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017968 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017969 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017970 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017971 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017972 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017973 resolveRegion.srcOffset.x = 0;
17974 resolveRegion.srcOffset.y = 0;
17975 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017976 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017977 resolveRegion.dstSubresource.mipLevel = 0;
17978 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017979 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017980 resolveRegion.dstOffset.x = 0;
17981 resolveRegion.dstOffset.y = 0;
17982 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017983 resolveRegion.extent.width = 1;
17984 resolveRegion.extent.height = 1;
17985 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017986 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017987 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017988
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017989 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017990
Chia-I Wuf7458c52015-10-26 21:10:41 +080017991 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017992 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017993 vkFreeMemory(m_device->device(), srcMem, NULL);
17994 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017995}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017996
Karl Schultz6addd812016-02-02 17:17:23 -070017997TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017998 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017999 // to using a DS format, then cause it to hit error due to COLOR_BIT not
18000 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018001 // The image format check comes 2nd in validation so we trigger it first,
18002 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070018003 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018004
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18006 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018007
Tony Barbour1fa09702017-03-16 12:09:08 -060018008 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018009 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018010 if (!depth_format) {
18011 return;
18012 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018013
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018014 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018015 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18016 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018017
18018 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018019 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18020 ds_pool_ci.pNext = NULL;
18021 ds_pool_ci.maxSets = 1;
18022 ds_pool_ci.poolSizeCount = 1;
18023 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018024
18025 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018026 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018027 ASSERT_VK_SUCCESS(err);
18028
18029 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018030 dsl_binding.binding = 0;
18031 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18032 dsl_binding.descriptorCount = 1;
18033 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18034 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018035
18036 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018037 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18038 ds_layout_ci.pNext = NULL;
18039 ds_layout_ci.bindingCount = 1;
18040 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018041 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018042 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018043 ASSERT_VK_SUCCESS(err);
18044
18045 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018046 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018047 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018048 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018049 alloc_info.descriptorPool = ds_pool;
18050 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018051 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018052 ASSERT_VK_SUCCESS(err);
18053
Karl Schultz6addd812016-02-02 17:17:23 -070018054 VkImage image_bad;
18055 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018056 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018057 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018058 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018059 const int32_t tex_width = 32;
18060 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018061
18062 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018063 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18064 image_create_info.pNext = NULL;
18065 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18066 image_create_info.format = tex_format_bad;
18067 image_create_info.extent.width = tex_width;
18068 image_create_info.extent.height = tex_height;
18069 image_create_info.extent.depth = 1;
18070 image_create_info.mipLevels = 1;
18071 image_create_info.arrayLayers = 1;
18072 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18073 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018074 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018075 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018076
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018077 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018078 ASSERT_VK_SUCCESS(err);
18079 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018080 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18081 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018082 ASSERT_VK_SUCCESS(err);
18083
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018084 // ---Bind image memory---
18085 VkMemoryRequirements img_mem_reqs;
18086 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18087 VkMemoryAllocateInfo image_alloc_info = {};
18088 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18089 image_alloc_info.pNext = NULL;
18090 image_alloc_info.memoryTypeIndex = 0;
18091 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018092 bool pass =
18093 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 -070018094 ASSERT_TRUE(pass);
18095 VkDeviceMemory mem;
18096 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18097 ASSERT_VK_SUCCESS(err);
18098 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18099 ASSERT_VK_SUCCESS(err);
18100 // -----------------------
18101
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018102 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018103 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018104 image_view_create_info.image = image_bad;
18105 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18106 image_view_create_info.format = tex_format_bad;
18107 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18108 image_view_create_info.subresourceRange.baseMipLevel = 0;
18109 image_view_create_info.subresourceRange.layerCount = 1;
18110 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018111 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018112
18113 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018114 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018115
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018116 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018117
Chia-I Wuf7458c52015-10-26 21:10:41 +080018118 vkDestroyImage(m_device->device(), image_bad, NULL);
18119 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018120 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18121 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018122
18123 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018124}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018125
18126TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018127 TEST_DESCRIPTION(
18128 "Call ClearColorImage w/ a depth|stencil image and "
18129 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018130
Tony Barbour1fa09702017-03-16 12:09:08 -060018131 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018132 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018133 if (!depth_format) {
18134 return;
18135 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18137
Tony Barbour552f6c02016-12-21 14:34:07 -070018138 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018139
18140 // Color image
18141 VkClearColorValue clear_color;
18142 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18143 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18144 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18145 const int32_t img_width = 32;
18146 const int32_t img_height = 32;
18147 VkImageCreateInfo image_create_info = {};
18148 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18149 image_create_info.pNext = NULL;
18150 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18151 image_create_info.format = color_format;
18152 image_create_info.extent.width = img_width;
18153 image_create_info.extent.height = img_height;
18154 image_create_info.extent.depth = 1;
18155 image_create_info.mipLevels = 1;
18156 image_create_info.arrayLayers = 1;
18157 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18158 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18159 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18160
18161 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018162 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018163
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018164 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018165
18166 // Depth/Stencil image
18167 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018168 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018169 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18170 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018171 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018172 ds_image_create_info.extent.width = 64;
18173 ds_image_create_info.extent.height = 64;
18174 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018175 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 -060018176
18177 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018178 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018179
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018180 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 -060018181
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018183
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018184 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018185 &color_range);
18186
18187 m_errorMonitor->VerifyFound();
18188
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18190 "vkCmdClearColorImage called with "
18191 "image created without "
18192 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018193
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018194 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018195 &color_range);
18196
18197 m_errorMonitor->VerifyFound();
18198
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018199 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18201 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018202
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018203 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18204 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018205
18206 m_errorMonitor->VerifyFound();
18207}
Tobin Ehliscde08892015-09-22 10:11:37 -060018208
Mike Schuchardt35fece12017-03-07 14:40:28 -070018209TEST_F(VkLayerTest, CommandQueueFlags) {
18210 TEST_DESCRIPTION(
18211 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18212 "graphics-only command");
18213
18214 ASSERT_NO_FATAL_FAILURE(Init());
18215
18216 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018217 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018218 printf(" Non-graphics queue family not found; skipped.\n");
18219 return;
18220 } else {
18221 // Create command pool on a non-graphics queue
18222 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18223
18224 // Setup command buffer on pool
18225 VkCommandBufferObj command_buffer(m_device, &command_pool);
18226 command_buffer.BeginCommandBuffer();
18227
18228 // Issue a graphics only command
18229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18230 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18231 command_buffer.SetViewport(0, 1, &viewport);
18232 m_errorMonitor->VerifyFound();
18233 }
18234}
18235
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018236// WSI Enabled Tests
18237//
Chris Forbes09368e42016-10-13 11:59:22 +130018238#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018239TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18240
18241#if defined(VK_USE_PLATFORM_XCB_KHR)
18242 VkSurfaceKHR surface = VK_NULL_HANDLE;
18243
18244 VkResult err;
18245 bool pass;
18246 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18247 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18248 // uint32_t swapchain_image_count = 0;
18249 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18250 // uint32_t image_index = 0;
18251 // VkPresentInfoKHR present_info = {};
18252
Tony Barbour1fa09702017-03-16 12:09:08 -060018253 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018254
18255 // Use the create function from one of the VK_KHR_*_surface extension in
18256 // order to create a surface, testing all known errors in the process,
18257 // before successfully creating a surface:
18258 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18260 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18261 pass = (err != VK_SUCCESS);
18262 ASSERT_TRUE(pass);
18263 m_errorMonitor->VerifyFound();
18264
18265 // Next, try to create a surface with the wrong
18266 // VkXcbSurfaceCreateInfoKHR::sType:
18267 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18268 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18270 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18271 pass = (err != VK_SUCCESS);
18272 ASSERT_TRUE(pass);
18273 m_errorMonitor->VerifyFound();
18274
18275 // Create a native window, and then correctly create a surface:
18276 xcb_connection_t *connection;
18277 xcb_screen_t *screen;
18278 xcb_window_t xcb_window;
18279 xcb_intern_atom_reply_t *atom_wm_delete_window;
18280
18281 const xcb_setup_t *setup;
18282 xcb_screen_iterator_t iter;
18283 int scr;
18284 uint32_t value_mask, value_list[32];
18285 int width = 1;
18286 int height = 1;
18287
18288 connection = xcb_connect(NULL, &scr);
18289 ASSERT_TRUE(connection != NULL);
18290 setup = xcb_get_setup(connection);
18291 iter = xcb_setup_roots_iterator(setup);
18292 while (scr-- > 0)
18293 xcb_screen_next(&iter);
18294 screen = iter.data;
18295
18296 xcb_window = xcb_generate_id(connection);
18297
18298 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18299 value_list[0] = screen->black_pixel;
18300 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18301
18302 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18303 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18304
18305 /* Magic code that will send notification when window is destroyed */
18306 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18307 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18308
18309 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18310 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18311 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18312 free(reply);
18313
18314 xcb_map_window(connection, xcb_window);
18315
18316 // Force the x/y coordinates to 100,100 results are identical in consecutive
18317 // runs
18318 const uint32_t coords[] = { 100, 100 };
18319 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18320
18321 // Finally, try to correctly create a surface:
18322 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18323 xcb_create_info.pNext = NULL;
18324 xcb_create_info.flags = 0;
18325 xcb_create_info.connection = connection;
18326 xcb_create_info.window = xcb_window;
18327 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18328 pass = (err == VK_SUCCESS);
18329 ASSERT_TRUE(pass);
18330
18331 // Check if surface supports presentation:
18332
18333 // 1st, do so without having queried the queue families:
18334 VkBool32 supported = false;
18335 // TODO: Get the following error to come out:
18336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18337 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18338 "function");
18339 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18340 pass = (err != VK_SUCCESS);
18341 // ASSERT_TRUE(pass);
18342 // m_errorMonitor->VerifyFound();
18343
18344 // Next, query a queue family index that's too large:
18345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18346 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18347 pass = (err != VK_SUCCESS);
18348 ASSERT_TRUE(pass);
18349 m_errorMonitor->VerifyFound();
18350
18351 // Finally, do so correctly:
18352 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18353 // SUPPORTED
18354 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18355 pass = (err == VK_SUCCESS);
18356 ASSERT_TRUE(pass);
18357
18358 // Before proceeding, try to create a swapchain without having called
18359 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18360 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18361 swapchain_create_info.pNext = NULL;
18362 swapchain_create_info.flags = 0;
18363 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18364 swapchain_create_info.surface = surface;
18365 swapchain_create_info.imageArrayLayers = 1;
18366 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18367 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18369 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18370 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18371 pass = (err != VK_SUCCESS);
18372 ASSERT_TRUE(pass);
18373 m_errorMonitor->VerifyFound();
18374
18375 // Get the surface capabilities:
18376 VkSurfaceCapabilitiesKHR surface_capabilities;
18377
18378 // Do so correctly (only error logged by this entrypoint is if the
18379 // extension isn't enabled):
18380 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18381 pass = (err == VK_SUCCESS);
18382 ASSERT_TRUE(pass);
18383
18384 // Get the surface formats:
18385 uint32_t surface_format_count;
18386
18387 // First, try without a pointer to surface_format_count:
18388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18389 "specified as NULL");
18390 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18391 pass = (err == VK_SUCCESS);
18392 ASSERT_TRUE(pass);
18393 m_errorMonitor->VerifyFound();
18394
18395 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18396 // correctly done a 1st try (to get the count):
18397 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18398 surface_format_count = 0;
18399 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18400 pass = (err == VK_SUCCESS);
18401 ASSERT_TRUE(pass);
18402 m_errorMonitor->VerifyFound();
18403
18404 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18405 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18406 pass = (err == VK_SUCCESS);
18407 ASSERT_TRUE(pass);
18408
18409 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18410 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18411
18412 // Next, do a 2nd try with surface_format_count being set too high:
18413 surface_format_count += 5;
18414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18415 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18416 pass = (err == VK_SUCCESS);
18417 ASSERT_TRUE(pass);
18418 m_errorMonitor->VerifyFound();
18419
18420 // Finally, do a correct 1st and 2nd try:
18421 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18422 pass = (err == VK_SUCCESS);
18423 ASSERT_TRUE(pass);
18424 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18425 pass = (err == VK_SUCCESS);
18426 ASSERT_TRUE(pass);
18427
18428 // Get the surface present modes:
18429 uint32_t surface_present_mode_count;
18430
18431 // First, try without a pointer to surface_format_count:
18432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18433 "specified as NULL");
18434
18435 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18436 pass = (err == VK_SUCCESS);
18437 ASSERT_TRUE(pass);
18438 m_errorMonitor->VerifyFound();
18439
18440 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18441 // correctly done a 1st try (to get the count):
18442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18443 surface_present_mode_count = 0;
18444 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18445 (VkPresentModeKHR *)&surface_present_mode_count);
18446 pass = (err == VK_SUCCESS);
18447 ASSERT_TRUE(pass);
18448 m_errorMonitor->VerifyFound();
18449
18450 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18451 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18452 pass = (err == VK_SUCCESS);
18453 ASSERT_TRUE(pass);
18454
18455 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18456 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18457
18458 // Next, do a 2nd try with surface_format_count being set too high:
18459 surface_present_mode_count += 5;
18460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18461 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18462 pass = (err == VK_SUCCESS);
18463 ASSERT_TRUE(pass);
18464 m_errorMonitor->VerifyFound();
18465
18466 // Finally, do a correct 1st and 2nd try:
18467 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18468 pass = (err == VK_SUCCESS);
18469 ASSERT_TRUE(pass);
18470 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18471 pass = (err == VK_SUCCESS);
18472 ASSERT_TRUE(pass);
18473
18474 // Create a swapchain:
18475
18476 // First, try without a pointer to swapchain_create_info:
18477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18478 "specified as NULL");
18479
18480 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18481 pass = (err != VK_SUCCESS);
18482 ASSERT_TRUE(pass);
18483 m_errorMonitor->VerifyFound();
18484
18485 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18486 // sType:
18487 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18489
18490 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18491 pass = (err != VK_SUCCESS);
18492 ASSERT_TRUE(pass);
18493 m_errorMonitor->VerifyFound();
18494
18495 // Next, call with a NULL swapchain pointer:
18496 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18497 swapchain_create_info.pNext = NULL;
18498 swapchain_create_info.flags = 0;
18499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18500 "specified as NULL");
18501
18502 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18503 pass = (err != VK_SUCCESS);
18504 ASSERT_TRUE(pass);
18505 m_errorMonitor->VerifyFound();
18506
18507 // TODO: Enhance swapchain layer so that
18508 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18509
18510 // Next, call with a queue family index that's too large:
18511 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18512 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18513 swapchain_create_info.queueFamilyIndexCount = 2;
18514 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18516 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18517 pass = (err != VK_SUCCESS);
18518 ASSERT_TRUE(pass);
18519 m_errorMonitor->VerifyFound();
18520
18521 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18522 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18523 swapchain_create_info.queueFamilyIndexCount = 1;
18524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18525 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18526 "pCreateInfo->pQueueFamilyIndices).");
18527 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18528 pass = (err != VK_SUCCESS);
18529 ASSERT_TRUE(pass);
18530 m_errorMonitor->VerifyFound();
18531
18532 // Next, call with an invalid imageSharingMode:
18533 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18534 swapchain_create_info.queueFamilyIndexCount = 1;
18535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18536 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18537 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18538 pass = (err != VK_SUCCESS);
18539 ASSERT_TRUE(pass);
18540 m_errorMonitor->VerifyFound();
18541 // Fix for the future:
18542 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18543 // SUPPORTED
18544 swapchain_create_info.queueFamilyIndexCount = 0;
18545 queueFamilyIndex[0] = 0;
18546 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18547
18548 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18549 // Get the images from a swapchain:
18550 // Acquire an image from a swapchain:
18551 // Present an image to a swapchain:
18552 // Destroy the swapchain:
18553
18554 // TODOs:
18555 //
18556 // - Try destroying the device without first destroying the swapchain
18557 //
18558 // - Try destroying the device without first destroying the surface
18559 //
18560 // - Try destroying the surface without first destroying the swapchain
18561
18562 // Destroy the surface:
18563 vkDestroySurfaceKHR(instance(), surface, NULL);
18564
18565 // Tear down the window:
18566 xcb_destroy_window(connection, xcb_window);
18567 xcb_disconnect(connection);
18568
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018569#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018570 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018571#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018572}
Chris Forbes09368e42016-10-13 11:59:22 +130018573#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018574
18575//
18576// POSITIVE VALIDATION TESTS
18577//
18578// These tests do not expect to encounter ANY validation errors pass only if this is true
18579
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018580TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18581 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018582 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018583 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18584
18585 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18586 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018587 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018588 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18589 command_buffer_allocate_info.commandBufferCount = 1;
18590
18591 VkCommandBuffer secondary_command_buffer;
18592 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18593 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18594 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18595 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18596 command_buffer_inheritance_info.renderPass = m_renderPass;
18597 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18598
18599 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18600 command_buffer_begin_info.flags =
18601 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18602 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18603
18604 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18605 VkClearAttachment color_attachment;
18606 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18607 color_attachment.clearValue.color.float32[0] = 0;
18608 color_attachment.clearValue.color.float32[1] = 0;
18609 color_attachment.clearValue.color.float32[2] = 0;
18610 color_attachment.clearValue.color.float32[3] = 0;
18611 color_attachment.colorAttachment = 0;
18612 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18613 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18614}
18615
Tobin Ehlise0006882016-11-03 10:14:28 -060018616TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018617 TEST_DESCRIPTION(
18618 "Perform an image layout transition in a secondary command buffer followed "
18619 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018620 VkResult err;
18621 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018622 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018623 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018624 if (!depth_format) {
18625 return;
18626 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18628 // Allocate a secondary and primary cmd buffer
18629 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18630 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018631 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018632 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18633 command_buffer_allocate_info.commandBufferCount = 1;
18634
18635 VkCommandBuffer secondary_command_buffer;
18636 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18637 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18638 VkCommandBuffer primary_command_buffer;
18639 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18640 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18641 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18642 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18643 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18644 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18645 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18646
18647 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18648 ASSERT_VK_SUCCESS(err);
18649 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018650 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 -060018651 ASSERT_TRUE(image.initialized());
18652 VkImageMemoryBarrier img_barrier = {};
18653 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18654 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18655 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18656 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18657 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18658 img_barrier.image = image.handle();
18659 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18660 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18661 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18662 img_barrier.subresourceRange.baseArrayLayer = 0;
18663 img_barrier.subresourceRange.baseMipLevel = 0;
18664 img_barrier.subresourceRange.layerCount = 1;
18665 img_barrier.subresourceRange.levelCount = 1;
18666 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18667 0, nullptr, 1, &img_barrier);
18668 err = vkEndCommandBuffer(secondary_command_buffer);
18669 ASSERT_VK_SUCCESS(err);
18670
18671 // Now update primary cmd buffer to execute secondary and transitions image
18672 command_buffer_begin_info.pInheritanceInfo = nullptr;
18673 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18674 ASSERT_VK_SUCCESS(err);
18675 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18676 VkImageMemoryBarrier img_barrier2 = {};
18677 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18678 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18679 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18680 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18681 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18682 img_barrier2.image = image.handle();
18683 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18684 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18685 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18686 img_barrier2.subresourceRange.baseArrayLayer = 0;
18687 img_barrier2.subresourceRange.baseMipLevel = 0;
18688 img_barrier2.subresourceRange.layerCount = 1;
18689 img_barrier2.subresourceRange.levelCount = 1;
18690 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18691 nullptr, 1, &img_barrier2);
18692 err = vkEndCommandBuffer(primary_command_buffer);
18693 ASSERT_VK_SUCCESS(err);
18694 VkSubmitInfo submit_info = {};
18695 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18696 submit_info.commandBufferCount = 1;
18697 submit_info.pCommandBuffers = &primary_command_buffer;
18698 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18699 ASSERT_VK_SUCCESS(err);
18700 m_errorMonitor->VerifyNotFound();
18701 err = vkDeviceWaitIdle(m_device->device());
18702 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018703 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18704 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018705}
18706
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018707// This is a positive test. No failures are expected.
18708TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018709 TEST_DESCRIPTION(
18710 "Ensure that the vkUpdateDescriptorSets validation code "
18711 "is ignoring VkWriteDescriptorSet members that are not "
18712 "related to the descriptor type specified by "
18713 "VkWriteDescriptorSet::descriptorType. Correct "
18714 "validation behavior will result in the test running to "
18715 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018716
18717 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18718
Tony Barbour1fa09702017-03-16 12:09:08 -060018719 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018720
18721 // Image Case
18722 {
18723 m_errorMonitor->ExpectSuccess();
18724
18725 VkImage image;
18726 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18727 const int32_t tex_width = 32;
18728 const int32_t tex_height = 32;
18729 VkImageCreateInfo image_create_info = {};
18730 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18731 image_create_info.pNext = NULL;
18732 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18733 image_create_info.format = tex_format;
18734 image_create_info.extent.width = tex_width;
18735 image_create_info.extent.height = tex_height;
18736 image_create_info.extent.depth = 1;
18737 image_create_info.mipLevels = 1;
18738 image_create_info.arrayLayers = 1;
18739 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18740 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18741 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18742 image_create_info.flags = 0;
18743 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18744 ASSERT_VK_SUCCESS(err);
18745
18746 VkMemoryRequirements memory_reqs;
18747 VkDeviceMemory image_memory;
18748 bool pass;
18749 VkMemoryAllocateInfo memory_info = {};
18750 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18751 memory_info.pNext = NULL;
18752 memory_info.allocationSize = 0;
18753 memory_info.memoryTypeIndex = 0;
18754 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18755 memory_info.allocationSize = memory_reqs.size;
18756 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18757 ASSERT_TRUE(pass);
18758 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18759 ASSERT_VK_SUCCESS(err);
18760 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18761 ASSERT_VK_SUCCESS(err);
18762
18763 VkImageViewCreateInfo image_view_create_info = {};
18764 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18765 image_view_create_info.image = image;
18766 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18767 image_view_create_info.format = tex_format;
18768 image_view_create_info.subresourceRange.layerCount = 1;
18769 image_view_create_info.subresourceRange.baseMipLevel = 0;
18770 image_view_create_info.subresourceRange.levelCount = 1;
18771 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18772
18773 VkImageView view;
18774 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18775 ASSERT_VK_SUCCESS(err);
18776
18777 VkDescriptorPoolSize ds_type_count = {};
18778 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18779 ds_type_count.descriptorCount = 1;
18780
18781 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18782 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18783 ds_pool_ci.pNext = NULL;
18784 ds_pool_ci.maxSets = 1;
18785 ds_pool_ci.poolSizeCount = 1;
18786 ds_pool_ci.pPoolSizes = &ds_type_count;
18787
18788 VkDescriptorPool ds_pool;
18789 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18790 ASSERT_VK_SUCCESS(err);
18791
18792 VkDescriptorSetLayoutBinding dsl_binding = {};
18793 dsl_binding.binding = 0;
18794 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18795 dsl_binding.descriptorCount = 1;
18796 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18797 dsl_binding.pImmutableSamplers = NULL;
18798
18799 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18800 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18801 ds_layout_ci.pNext = NULL;
18802 ds_layout_ci.bindingCount = 1;
18803 ds_layout_ci.pBindings = &dsl_binding;
18804 VkDescriptorSetLayout ds_layout;
18805 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18806 ASSERT_VK_SUCCESS(err);
18807
18808 VkDescriptorSet descriptor_set;
18809 VkDescriptorSetAllocateInfo alloc_info = {};
18810 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18811 alloc_info.descriptorSetCount = 1;
18812 alloc_info.descriptorPool = ds_pool;
18813 alloc_info.pSetLayouts = &ds_layout;
18814 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18815 ASSERT_VK_SUCCESS(err);
18816
18817 VkDescriptorImageInfo image_info = {};
18818 image_info.imageView = view;
18819 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18820
18821 VkWriteDescriptorSet descriptor_write;
18822 memset(&descriptor_write, 0, sizeof(descriptor_write));
18823 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18824 descriptor_write.dstSet = descriptor_set;
18825 descriptor_write.dstBinding = 0;
18826 descriptor_write.descriptorCount = 1;
18827 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18828 descriptor_write.pImageInfo = &image_info;
18829
18830 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18831 // be
18832 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18833 // This will most likely produce a crash if the parameter_validation
18834 // layer
18835 // does not correctly ignore pBufferInfo.
18836 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18837 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18838
18839 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18840
18841 m_errorMonitor->VerifyNotFound();
18842
18843 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18844 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18845 vkDestroyImageView(m_device->device(), view, NULL);
18846 vkDestroyImage(m_device->device(), image, NULL);
18847 vkFreeMemory(m_device->device(), image_memory, NULL);
18848 }
18849
18850 // Buffer Case
18851 {
18852 m_errorMonitor->ExpectSuccess();
18853
18854 VkBuffer buffer;
18855 uint32_t queue_family_index = 0;
18856 VkBufferCreateInfo buffer_create_info = {};
18857 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18858 buffer_create_info.size = 1024;
18859 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18860 buffer_create_info.queueFamilyIndexCount = 1;
18861 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18862
18863 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18864 ASSERT_VK_SUCCESS(err);
18865
18866 VkMemoryRequirements memory_reqs;
18867 VkDeviceMemory buffer_memory;
18868 bool pass;
18869 VkMemoryAllocateInfo memory_info = {};
18870 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18871 memory_info.pNext = NULL;
18872 memory_info.allocationSize = 0;
18873 memory_info.memoryTypeIndex = 0;
18874
18875 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18876 memory_info.allocationSize = memory_reqs.size;
18877 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18878 ASSERT_TRUE(pass);
18879
18880 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18881 ASSERT_VK_SUCCESS(err);
18882 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18883 ASSERT_VK_SUCCESS(err);
18884
18885 VkDescriptorPoolSize ds_type_count = {};
18886 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18887 ds_type_count.descriptorCount = 1;
18888
18889 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18890 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18891 ds_pool_ci.pNext = NULL;
18892 ds_pool_ci.maxSets = 1;
18893 ds_pool_ci.poolSizeCount = 1;
18894 ds_pool_ci.pPoolSizes = &ds_type_count;
18895
18896 VkDescriptorPool ds_pool;
18897 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18898 ASSERT_VK_SUCCESS(err);
18899
18900 VkDescriptorSetLayoutBinding dsl_binding = {};
18901 dsl_binding.binding = 0;
18902 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18903 dsl_binding.descriptorCount = 1;
18904 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18905 dsl_binding.pImmutableSamplers = NULL;
18906
18907 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18908 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18909 ds_layout_ci.pNext = NULL;
18910 ds_layout_ci.bindingCount = 1;
18911 ds_layout_ci.pBindings = &dsl_binding;
18912 VkDescriptorSetLayout ds_layout;
18913 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18914 ASSERT_VK_SUCCESS(err);
18915
18916 VkDescriptorSet descriptor_set;
18917 VkDescriptorSetAllocateInfo alloc_info = {};
18918 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18919 alloc_info.descriptorSetCount = 1;
18920 alloc_info.descriptorPool = ds_pool;
18921 alloc_info.pSetLayouts = &ds_layout;
18922 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18923 ASSERT_VK_SUCCESS(err);
18924
18925 VkDescriptorBufferInfo buffer_info = {};
18926 buffer_info.buffer = buffer;
18927 buffer_info.offset = 0;
18928 buffer_info.range = 1024;
18929
18930 VkWriteDescriptorSet descriptor_write;
18931 memset(&descriptor_write, 0, sizeof(descriptor_write));
18932 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18933 descriptor_write.dstSet = descriptor_set;
18934 descriptor_write.dstBinding = 0;
18935 descriptor_write.descriptorCount = 1;
18936 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18937 descriptor_write.pBufferInfo = &buffer_info;
18938
18939 // Set pImageInfo and pTexelBufferView to invalid values, which should
18940 // be
18941 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18942 // This will most likely produce a crash if the parameter_validation
18943 // layer
18944 // does not correctly ignore pImageInfo.
18945 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18946 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18947
18948 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18949
18950 m_errorMonitor->VerifyNotFound();
18951
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018952 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18953 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18954 vkDestroyBuffer(m_device->device(), buffer, NULL);
18955 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18956 }
18957
18958 // Texel Buffer Case
18959 {
18960 m_errorMonitor->ExpectSuccess();
18961
18962 VkBuffer buffer;
18963 uint32_t queue_family_index = 0;
18964 VkBufferCreateInfo buffer_create_info = {};
18965 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18966 buffer_create_info.size = 1024;
18967 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18968 buffer_create_info.queueFamilyIndexCount = 1;
18969 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18970
18971 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18972 ASSERT_VK_SUCCESS(err);
18973
18974 VkMemoryRequirements memory_reqs;
18975 VkDeviceMemory buffer_memory;
18976 bool pass;
18977 VkMemoryAllocateInfo memory_info = {};
18978 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18979 memory_info.pNext = NULL;
18980 memory_info.allocationSize = 0;
18981 memory_info.memoryTypeIndex = 0;
18982
18983 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18984 memory_info.allocationSize = memory_reqs.size;
18985 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18986 ASSERT_TRUE(pass);
18987
18988 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18989 ASSERT_VK_SUCCESS(err);
18990 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18991 ASSERT_VK_SUCCESS(err);
18992
18993 VkBufferViewCreateInfo buff_view_ci = {};
18994 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18995 buff_view_ci.buffer = buffer;
18996 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18997 buff_view_ci.range = VK_WHOLE_SIZE;
18998 VkBufferView buffer_view;
18999 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
19000
19001 VkDescriptorPoolSize ds_type_count = {};
19002 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19003 ds_type_count.descriptorCount = 1;
19004
19005 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19006 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19007 ds_pool_ci.pNext = NULL;
19008 ds_pool_ci.maxSets = 1;
19009 ds_pool_ci.poolSizeCount = 1;
19010 ds_pool_ci.pPoolSizes = &ds_type_count;
19011
19012 VkDescriptorPool ds_pool;
19013 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19014 ASSERT_VK_SUCCESS(err);
19015
19016 VkDescriptorSetLayoutBinding dsl_binding = {};
19017 dsl_binding.binding = 0;
19018 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19019 dsl_binding.descriptorCount = 1;
19020 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19021 dsl_binding.pImmutableSamplers = NULL;
19022
19023 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19024 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19025 ds_layout_ci.pNext = NULL;
19026 ds_layout_ci.bindingCount = 1;
19027 ds_layout_ci.pBindings = &dsl_binding;
19028 VkDescriptorSetLayout ds_layout;
19029 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19030 ASSERT_VK_SUCCESS(err);
19031
19032 VkDescriptorSet descriptor_set;
19033 VkDescriptorSetAllocateInfo alloc_info = {};
19034 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19035 alloc_info.descriptorSetCount = 1;
19036 alloc_info.descriptorPool = ds_pool;
19037 alloc_info.pSetLayouts = &ds_layout;
19038 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19039 ASSERT_VK_SUCCESS(err);
19040
19041 VkWriteDescriptorSet descriptor_write;
19042 memset(&descriptor_write, 0, sizeof(descriptor_write));
19043 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19044 descriptor_write.dstSet = descriptor_set;
19045 descriptor_write.dstBinding = 0;
19046 descriptor_write.descriptorCount = 1;
19047 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19048 descriptor_write.pTexelBufferView = &buffer_view;
19049
19050 // Set pImageInfo and pBufferInfo to invalid values, which should be
19051 // ignored for descriptorType ==
19052 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19053 // This will most likely produce a crash if the parameter_validation
19054 // layer
19055 // does not correctly ignore pImageInfo and pBufferInfo.
19056 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19057 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19058
19059 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19060
19061 m_errorMonitor->VerifyNotFound();
19062
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019063 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19064 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19065 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19066 vkDestroyBuffer(m_device->device(), buffer, NULL);
19067 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19068 }
19069}
19070
Tobin Ehlisf7428442016-10-25 07:58:24 -060019071TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19072 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19073
Tony Barbour1fa09702017-03-16 12:09:08 -060019074 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019075 // Create layout where two binding #s are "1"
19076 static const uint32_t NUM_BINDINGS = 3;
19077 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19078 dsl_binding[0].binding = 1;
19079 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19080 dsl_binding[0].descriptorCount = 1;
19081 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19082 dsl_binding[0].pImmutableSamplers = NULL;
19083 dsl_binding[1].binding = 0;
19084 dsl_binding[1].descriptorCount = 1;
19085 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19086 dsl_binding[1].descriptorCount = 1;
19087 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19088 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019089 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019090 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19091 dsl_binding[2].descriptorCount = 1;
19092 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19093 dsl_binding[2].pImmutableSamplers = NULL;
19094
19095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19097 ds_layout_ci.pNext = NULL;
19098 ds_layout_ci.bindingCount = NUM_BINDINGS;
19099 ds_layout_ci.pBindings = dsl_binding;
19100 VkDescriptorSetLayout ds_layout;
19101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
19102 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19103 m_errorMonitor->VerifyFound();
19104}
19105
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019106TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019107 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
19108
Tony Barbour1fa09702017-03-16 12:09:08 -060019109 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019110
Tony Barbour552f6c02016-12-21 14:34:07 -070019111 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019112
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019113 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
19114
19115 {
19116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
19117 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
19118 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19119 m_errorMonitor->VerifyFound();
19120 }
19121
19122 {
19123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
19124 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
19125 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19126 m_errorMonitor->VerifyFound();
19127 }
19128
19129 {
19130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19131 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
19132 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19133 m_errorMonitor->VerifyFound();
19134 }
19135
19136 {
19137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19138 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
19139 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19140 m_errorMonitor->VerifyFound();
19141 }
19142
19143 {
19144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
19145 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
19146 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19147 m_errorMonitor->VerifyFound();
19148 }
19149
19150 {
19151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
19152 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
19153 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19154 m_errorMonitor->VerifyFound();
19155 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019156
19157 {
19158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19159 VkRect2D scissor = {{-1, 0}, {16, 16}};
19160 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19161 m_errorMonitor->VerifyFound();
19162 }
19163
19164 {
19165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19166 VkRect2D scissor = {{0, -2}, {16, 16}};
19167 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19168 m_errorMonitor->VerifyFound();
19169 }
19170
19171 {
19172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
19173 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
19174 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19175 m_errorMonitor->VerifyFound();
19176 }
19177
19178 {
19179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
19180 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
19181 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19182 m_errorMonitor->VerifyFound();
19183 }
19184
Tony Barbour552f6c02016-12-21 14:34:07 -070019185 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019186}
19187
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019188// This is a positive test. No failures are expected.
19189TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
19190 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
19191 VkResult err;
19192
Tony Barbour1fa09702017-03-16 12:09:08 -060019193 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019194 m_errorMonitor->ExpectSuccess();
19195 VkDescriptorPoolSize ds_type_count = {};
19196 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19197 ds_type_count.descriptorCount = 2;
19198
19199 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19200 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19201 ds_pool_ci.pNext = NULL;
19202 ds_pool_ci.maxSets = 1;
19203 ds_pool_ci.poolSizeCount = 1;
19204 ds_pool_ci.pPoolSizes = &ds_type_count;
19205
19206 VkDescriptorPool ds_pool;
19207 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19208 ASSERT_VK_SUCCESS(err);
19209
19210 // Create layout with two uniform buffer descriptors w/ empty binding between them
19211 static const uint32_t NUM_BINDINGS = 3;
19212 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19213 dsl_binding[0].binding = 0;
19214 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19215 dsl_binding[0].descriptorCount = 1;
19216 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
19217 dsl_binding[0].pImmutableSamplers = NULL;
19218 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019219 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019220 dsl_binding[2].binding = 2;
19221 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19222 dsl_binding[2].descriptorCount = 1;
19223 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
19224 dsl_binding[2].pImmutableSamplers = NULL;
19225
19226 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19227 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19228 ds_layout_ci.pNext = NULL;
19229 ds_layout_ci.bindingCount = NUM_BINDINGS;
19230 ds_layout_ci.pBindings = dsl_binding;
19231 VkDescriptorSetLayout ds_layout;
19232 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19233 ASSERT_VK_SUCCESS(err);
19234
19235 VkDescriptorSet descriptor_set = {};
19236 VkDescriptorSetAllocateInfo alloc_info = {};
19237 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19238 alloc_info.descriptorSetCount = 1;
19239 alloc_info.descriptorPool = ds_pool;
19240 alloc_info.pSetLayouts = &ds_layout;
19241 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19242 ASSERT_VK_SUCCESS(err);
19243
19244 // Create a buffer to be used for update
19245 VkBufferCreateInfo buff_ci = {};
19246 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19247 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19248 buff_ci.size = 256;
19249 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19250 VkBuffer buffer;
19251 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19252 ASSERT_VK_SUCCESS(err);
19253 // Have to bind memory to buffer before descriptor update
19254 VkMemoryAllocateInfo mem_alloc = {};
19255 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19256 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019257 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019258 mem_alloc.memoryTypeIndex = 0;
19259
19260 VkMemoryRequirements mem_reqs;
19261 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19262 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19263 if (!pass) {
19264 vkDestroyBuffer(m_device->device(), buffer, NULL);
19265 return;
19266 }
19267
19268 VkDeviceMemory mem;
19269 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19270 ASSERT_VK_SUCCESS(err);
19271 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19272 ASSERT_VK_SUCCESS(err);
19273
19274 // Only update the descriptor at binding 2
19275 VkDescriptorBufferInfo buff_info = {};
19276 buff_info.buffer = buffer;
19277 buff_info.offset = 0;
19278 buff_info.range = VK_WHOLE_SIZE;
19279 VkWriteDescriptorSet descriptor_write = {};
19280 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19281 descriptor_write.dstBinding = 2;
19282 descriptor_write.descriptorCount = 1;
19283 descriptor_write.pTexelBufferView = nullptr;
19284 descriptor_write.pBufferInfo = &buff_info;
19285 descriptor_write.pImageInfo = nullptr;
19286 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19287 descriptor_write.dstSet = descriptor_set;
19288
19289 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19290
19291 m_errorMonitor->VerifyNotFound();
19292 // Cleanup
19293 vkFreeMemory(m_device->device(), mem, NULL);
19294 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19295 vkDestroyBuffer(m_device->device(), buffer, NULL);
19296 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19297}
19298
19299// This is a positive test. No failures are expected.
19300TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19301 VkResult err;
19302 bool pass;
19303
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019304 TEST_DESCRIPTION(
19305 "Create a buffer, allocate memory, bind memory, destroy "
19306 "the buffer, create an image, and bind the same memory to "
19307 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019308
19309 m_errorMonitor->ExpectSuccess();
19310
Tony Barbour1fa09702017-03-16 12:09:08 -060019311 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019312
19313 VkBuffer buffer;
19314 VkImage image;
19315 VkDeviceMemory mem;
19316 VkMemoryRequirements mem_reqs;
19317
19318 VkBufferCreateInfo buf_info = {};
19319 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19320 buf_info.pNext = NULL;
19321 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19322 buf_info.size = 256;
19323 buf_info.queueFamilyIndexCount = 0;
19324 buf_info.pQueueFamilyIndices = NULL;
19325 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19326 buf_info.flags = 0;
19327 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19328 ASSERT_VK_SUCCESS(err);
19329
19330 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19331
19332 VkMemoryAllocateInfo alloc_info = {};
19333 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19334 alloc_info.pNext = NULL;
19335 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019336
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019337 // Ensure memory is big enough for both bindings
19338 alloc_info.allocationSize = 0x10000;
19339
19340 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19341 if (!pass) {
19342 vkDestroyBuffer(m_device->device(), buffer, NULL);
19343 return;
19344 }
19345
19346 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19347 ASSERT_VK_SUCCESS(err);
19348
19349 uint8_t *pData;
19350 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19351 ASSERT_VK_SUCCESS(err);
19352
19353 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19354
19355 vkUnmapMemory(m_device->device(), mem);
19356
19357 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19358 ASSERT_VK_SUCCESS(err);
19359
19360 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19361 // memory. In fact, it was never used by the GPU.
19362 // Just be be sure, wait for idle.
19363 vkDestroyBuffer(m_device->device(), buffer, NULL);
19364 vkDeviceWaitIdle(m_device->device());
19365
Tobin Ehlis6a005702016-12-28 15:25:56 -070019366 // Use optimal as some platforms report linear support but then fail image creation
19367 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19368 VkImageFormatProperties image_format_properties;
19369 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19370 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19371 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019372 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019373 vkFreeMemory(m_device->device(), mem, NULL);
19374 return;
19375 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019376 VkImageCreateInfo image_create_info = {};
19377 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19378 image_create_info.pNext = NULL;
19379 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19380 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19381 image_create_info.extent.width = 64;
19382 image_create_info.extent.height = 64;
19383 image_create_info.extent.depth = 1;
19384 image_create_info.mipLevels = 1;
19385 image_create_info.arrayLayers = 1;
19386 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019387 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019388 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19389 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19390 image_create_info.queueFamilyIndexCount = 0;
19391 image_create_info.pQueueFamilyIndices = NULL;
19392 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19393 image_create_info.flags = 0;
19394
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019395 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019396 * to be textures or it will be the staging image if they are not.
19397 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019398 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19399 ASSERT_VK_SUCCESS(err);
19400
19401 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19402
Tobin Ehlis6a005702016-12-28 15:25:56 -070019403 VkMemoryAllocateInfo mem_alloc = {};
19404 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19405 mem_alloc.pNext = NULL;
19406 mem_alloc.allocationSize = 0;
19407 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019408 mem_alloc.allocationSize = mem_reqs.size;
19409
19410 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19411 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019412 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019413 vkDestroyImage(m_device->device(), image, NULL);
19414 return;
19415 }
19416
19417 // VALIDATION FAILURE:
19418 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19419 ASSERT_VK_SUCCESS(err);
19420
19421 m_errorMonitor->VerifyNotFound();
19422
19423 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019424 vkDestroyImage(m_device->device(), image, NULL);
19425}
19426
Tony Barbourab713912017-02-02 14:17:35 -070019427// This is a positive test. No failures are expected.
19428TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19429 VkResult err;
19430
19431 TEST_DESCRIPTION(
19432 "Call all applicable destroy and free routines with NULL"
19433 "handles, expecting no validation errors");
19434
19435 m_errorMonitor->ExpectSuccess();
19436
Tony Barbour1fa09702017-03-16 12:09:08 -060019437 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019438 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19439 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19440 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19441 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19442 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19443 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19444 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19445 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19446 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19447 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19448 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19449 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19450 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19451 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19452 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19453 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19454 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19455 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19456 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19457 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19458
19459 VkCommandPool command_pool;
19460 VkCommandPoolCreateInfo pool_create_info{};
19461 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19462 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19463 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19464 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19465 VkCommandBuffer command_buffers[3] = {};
19466 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19467 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19468 command_buffer_allocate_info.commandPool = command_pool;
19469 command_buffer_allocate_info.commandBufferCount = 1;
19470 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19471 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19472 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19473 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19474
19475 VkDescriptorPoolSize ds_type_count = {};
19476 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19477 ds_type_count.descriptorCount = 1;
19478
19479 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19480 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19481 ds_pool_ci.pNext = NULL;
19482 ds_pool_ci.maxSets = 1;
19483 ds_pool_ci.poolSizeCount = 1;
19484 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19485 ds_pool_ci.pPoolSizes = &ds_type_count;
19486
19487 VkDescriptorPool ds_pool;
19488 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19489 ASSERT_VK_SUCCESS(err);
19490
19491 VkDescriptorSetLayoutBinding dsl_binding = {};
19492 dsl_binding.binding = 2;
19493 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19494 dsl_binding.descriptorCount = 1;
19495 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19496 dsl_binding.pImmutableSamplers = NULL;
19497 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19498 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19499 ds_layout_ci.pNext = NULL;
19500 ds_layout_ci.bindingCount = 1;
19501 ds_layout_ci.pBindings = &dsl_binding;
19502 VkDescriptorSetLayout ds_layout;
19503 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19504 ASSERT_VK_SUCCESS(err);
19505
19506 VkDescriptorSet descriptor_sets[3] = {};
19507 VkDescriptorSetAllocateInfo alloc_info = {};
19508 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19509 alloc_info.descriptorSetCount = 1;
19510 alloc_info.descriptorPool = ds_pool;
19511 alloc_info.pSetLayouts = &ds_layout;
19512 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19513 ASSERT_VK_SUCCESS(err);
19514 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19515 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19516 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19517
19518 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19519
19520 m_errorMonitor->VerifyNotFound();
19521}
19522
Tony Barbour626994c2017-02-08 15:29:37 -070019523TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019524 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019525
19526 m_errorMonitor->ExpectSuccess();
19527
Tony Barbour1fa09702017-03-16 12:09:08 -060019528 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019529 VkCommandBuffer cmd_bufs[4];
19530 VkCommandBufferAllocateInfo alloc_info;
19531 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19532 alloc_info.pNext = NULL;
19533 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019534 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019535 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19536 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19537 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019538 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070019539 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19540 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019541 ASSERT_TRUE(image.initialized());
19542 VkCommandBufferBeginInfo cb_binfo;
19543 cb_binfo.pNext = NULL;
19544 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19545 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19546 cb_binfo.flags = 0;
19547 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19548 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19549 VkImageMemoryBarrier img_barrier = {};
19550 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19551 img_barrier.pNext = NULL;
19552 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19553 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19554 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19555 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19556 img_barrier.image = image.handle();
19557 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19558 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19559 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19560 img_barrier.subresourceRange.baseArrayLayer = 0;
19561 img_barrier.subresourceRange.baseMipLevel = 0;
19562 img_barrier.subresourceRange.layerCount = 1;
19563 img_barrier.subresourceRange.levelCount = 1;
19564 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19565 &img_barrier);
19566 vkEndCommandBuffer(cmd_bufs[0]);
19567 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19568 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19569 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19570 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19571 &img_barrier);
19572 vkEndCommandBuffer(cmd_bufs[1]);
19573 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19574 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19575 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19576 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19577 &img_barrier);
19578 vkEndCommandBuffer(cmd_bufs[2]);
19579 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19580 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19581 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19582 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19583 &img_barrier);
19584 vkEndCommandBuffer(cmd_bufs[3]);
19585
19586 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19587 VkSemaphore semaphore1, semaphore2;
19588 VkSemaphoreCreateInfo semaphore_create_info{};
19589 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19590 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19591 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19592 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19593 VkSubmitInfo submit_info[3];
19594 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19595 submit_info[0].pNext = nullptr;
19596 submit_info[0].commandBufferCount = 1;
19597 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19598 submit_info[0].signalSemaphoreCount = 1;
19599 submit_info[0].pSignalSemaphores = &semaphore1;
19600 submit_info[0].waitSemaphoreCount = 0;
19601 submit_info[0].pWaitDstStageMask = nullptr;
19602 submit_info[0].pWaitDstStageMask = flags;
19603 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19604 submit_info[1].pNext = nullptr;
19605 submit_info[1].commandBufferCount = 1;
19606 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19607 submit_info[1].waitSemaphoreCount = 1;
19608 submit_info[1].pWaitSemaphores = &semaphore1;
19609 submit_info[1].signalSemaphoreCount = 1;
19610 submit_info[1].pSignalSemaphores = &semaphore2;
19611 submit_info[1].pWaitDstStageMask = flags;
19612 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19613 submit_info[2].pNext = nullptr;
19614 submit_info[2].commandBufferCount = 2;
19615 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19616 submit_info[2].waitSemaphoreCount = 1;
19617 submit_info[2].pWaitSemaphores = &semaphore2;
19618 submit_info[2].signalSemaphoreCount = 0;
19619 submit_info[2].pSignalSemaphores = nullptr;
19620 submit_info[2].pWaitDstStageMask = flags;
19621 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19622 vkQueueWaitIdle(m_device->m_queue);
19623
19624 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19625 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19626 m_errorMonitor->VerifyNotFound();
19627}
19628
Tobin Ehlis953e8392016-11-17 10:54:13 -070019629TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19630 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19631 // We previously had a bug where dynamic offset of inactive bindings was still being used
19632 VkResult err;
19633 m_errorMonitor->ExpectSuccess();
19634
Tony Barbour1fa09702017-03-16 12:09:08 -060019635 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019636 ASSERT_NO_FATAL_FAILURE(InitViewport());
19637 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19638
19639 VkDescriptorPoolSize ds_type_count = {};
19640 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19641 ds_type_count.descriptorCount = 3;
19642
19643 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19644 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19645 ds_pool_ci.pNext = NULL;
19646 ds_pool_ci.maxSets = 1;
19647 ds_pool_ci.poolSizeCount = 1;
19648 ds_pool_ci.pPoolSizes = &ds_type_count;
19649
19650 VkDescriptorPool ds_pool;
19651 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19652 ASSERT_VK_SUCCESS(err);
19653
19654 const uint32_t BINDING_COUNT = 3;
19655 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019656 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019657 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19658 dsl_binding[0].descriptorCount = 1;
19659 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19660 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019661 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019662 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19663 dsl_binding[1].descriptorCount = 1;
19664 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19665 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019666 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019667 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19668 dsl_binding[2].descriptorCount = 1;
19669 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19670 dsl_binding[2].pImmutableSamplers = NULL;
19671
19672 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19673 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19674 ds_layout_ci.pNext = NULL;
19675 ds_layout_ci.bindingCount = BINDING_COUNT;
19676 ds_layout_ci.pBindings = dsl_binding;
19677 VkDescriptorSetLayout ds_layout;
19678 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19679 ASSERT_VK_SUCCESS(err);
19680
19681 VkDescriptorSet descriptor_set;
19682 VkDescriptorSetAllocateInfo alloc_info = {};
19683 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19684 alloc_info.descriptorSetCount = 1;
19685 alloc_info.descriptorPool = ds_pool;
19686 alloc_info.pSetLayouts = &ds_layout;
19687 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19688 ASSERT_VK_SUCCESS(err);
19689
19690 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19691 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19692 pipeline_layout_ci.pNext = NULL;
19693 pipeline_layout_ci.setLayoutCount = 1;
19694 pipeline_layout_ci.pSetLayouts = &ds_layout;
19695
19696 VkPipelineLayout pipeline_layout;
19697 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19698 ASSERT_VK_SUCCESS(err);
19699
19700 // Create two buffers to update the descriptors with
19701 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19702 uint32_t qfi = 0;
19703 VkBufferCreateInfo buffCI = {};
19704 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19705 buffCI.size = 2048;
19706 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19707 buffCI.queueFamilyIndexCount = 1;
19708 buffCI.pQueueFamilyIndices = &qfi;
19709
19710 VkBuffer dyub1;
19711 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19712 ASSERT_VK_SUCCESS(err);
19713 // buffer2
19714 buffCI.size = 1024;
19715 VkBuffer dyub2;
19716 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19717 ASSERT_VK_SUCCESS(err);
19718 // Allocate memory and bind to buffers
19719 VkMemoryAllocateInfo mem_alloc[2] = {};
19720 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19721 mem_alloc[0].pNext = NULL;
19722 mem_alloc[0].memoryTypeIndex = 0;
19723 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19724 mem_alloc[1].pNext = NULL;
19725 mem_alloc[1].memoryTypeIndex = 0;
19726
19727 VkMemoryRequirements mem_reqs1;
19728 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19729 VkMemoryRequirements mem_reqs2;
19730 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19731 mem_alloc[0].allocationSize = mem_reqs1.size;
19732 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19733 mem_alloc[1].allocationSize = mem_reqs2.size;
19734 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19735 if (!pass) {
19736 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19737 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19738 return;
19739 }
19740
19741 VkDeviceMemory mem1;
19742 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19743 ASSERT_VK_SUCCESS(err);
19744 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19745 ASSERT_VK_SUCCESS(err);
19746 VkDeviceMemory mem2;
19747 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19748 ASSERT_VK_SUCCESS(err);
19749 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19750 ASSERT_VK_SUCCESS(err);
19751 // Update descriptors
19752 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19753 buff_info[0].buffer = dyub1;
19754 buff_info[0].offset = 0;
19755 buff_info[0].range = 256;
19756 buff_info[1].buffer = dyub1;
19757 buff_info[1].offset = 256;
19758 buff_info[1].range = 512;
19759 buff_info[2].buffer = dyub2;
19760 buff_info[2].offset = 0;
19761 buff_info[2].range = 512;
19762
19763 VkWriteDescriptorSet descriptor_write;
19764 memset(&descriptor_write, 0, sizeof(descriptor_write));
19765 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19766 descriptor_write.dstSet = descriptor_set;
19767 descriptor_write.dstBinding = 0;
19768 descriptor_write.descriptorCount = BINDING_COUNT;
19769 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19770 descriptor_write.pBufferInfo = buff_info;
19771
19772 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19773
Tony Barbour552f6c02016-12-21 14:34:07 -070019774 m_commandBuffer->BeginCommandBuffer();
19775 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019776
19777 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019778 char const *vsSource =
19779 "#version 450\n"
19780 "\n"
19781 "out gl_PerVertex { \n"
19782 " vec4 gl_Position;\n"
19783 "};\n"
19784 "void main(){\n"
19785 " gl_Position = vec4(1);\n"
19786 "}\n";
19787 char const *fsSource =
19788 "#version 450\n"
19789 "\n"
19790 "layout(location=0) out vec4 x;\n"
19791 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19792 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19793 "void main(){\n"
19794 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19795 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019796 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19797 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19798 VkPipelineObj pipe(m_device);
19799 pipe.SetViewport(m_viewports);
19800 pipe.SetScissor(m_scissors);
19801 pipe.AddShader(&vs);
19802 pipe.AddShader(&fs);
19803 pipe.AddColorAttachment();
19804 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19805
19806 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19807 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19808 // we used to have a bug in this case.
19809 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19810 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19811 &descriptor_set, BINDING_COUNT, dyn_off);
19812 Draw(1, 0, 0, 0);
19813 m_errorMonitor->VerifyNotFound();
19814
19815 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19816 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19817 vkFreeMemory(m_device->device(), mem1, NULL);
19818 vkFreeMemory(m_device->device(), mem2, NULL);
19819
19820 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19821 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19822 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19823}
19824
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019825TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019826 TEST_DESCRIPTION(
19827 "Ensure that validations handling of non-coherent memory "
19828 "mapping while using VK_WHOLE_SIZE does not cause access "
19829 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019830 VkResult err;
19831 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019832 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019833
19834 VkDeviceMemory mem;
19835 VkMemoryRequirements mem_reqs;
19836 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019837 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019838 VkMemoryAllocateInfo alloc_info = {};
19839 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19840 alloc_info.pNext = NULL;
19841 alloc_info.memoryTypeIndex = 0;
19842
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019843 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019844 alloc_info.allocationSize = allocation_size;
19845
19846 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19847 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 -070019848 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019849 if (!pass) {
19850 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019851 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19852 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019853 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019854 pass = m_device->phy().set_memory_type(
19855 mem_reqs.memoryTypeBits, &alloc_info,
19856 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19857 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019858 if (!pass) {
19859 return;
19860 }
19861 }
19862 }
19863
19864 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19865 ASSERT_VK_SUCCESS(err);
19866
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019867 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019868 m_errorMonitor->ExpectSuccess();
19869 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19870 ASSERT_VK_SUCCESS(err);
19871 VkMappedMemoryRange mmr = {};
19872 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19873 mmr.memory = mem;
19874 mmr.offset = 0;
19875 mmr.size = VK_WHOLE_SIZE;
19876 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19877 ASSERT_VK_SUCCESS(err);
19878 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19879 ASSERT_VK_SUCCESS(err);
19880 m_errorMonitor->VerifyNotFound();
19881 vkUnmapMemory(m_device->device(), mem);
19882
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019883 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019884 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019885 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019886 ASSERT_VK_SUCCESS(err);
19887 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19888 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019889 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019890 mmr.size = VK_WHOLE_SIZE;
19891 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19892 ASSERT_VK_SUCCESS(err);
19893 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19894 ASSERT_VK_SUCCESS(err);
19895 m_errorMonitor->VerifyNotFound();
19896 vkUnmapMemory(m_device->device(), mem);
19897
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019898 // Map with offset and size
19899 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019900 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019901 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019902 ASSERT_VK_SUCCESS(err);
19903 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19904 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019905 mmr.offset = 4 * atom_size;
19906 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019907 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19908 ASSERT_VK_SUCCESS(err);
19909 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19910 ASSERT_VK_SUCCESS(err);
19911 m_errorMonitor->VerifyNotFound();
19912 vkUnmapMemory(m_device->device(), mem);
19913
19914 // Map without offset and flush WHOLE_SIZE with two separate offsets
19915 m_errorMonitor->ExpectSuccess();
19916 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19917 ASSERT_VK_SUCCESS(err);
19918 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19919 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019920 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019921 mmr.size = VK_WHOLE_SIZE;
19922 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19923 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019924 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019925 mmr.size = VK_WHOLE_SIZE;
19926 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19927 ASSERT_VK_SUCCESS(err);
19928 m_errorMonitor->VerifyNotFound();
19929 vkUnmapMemory(m_device->device(), mem);
19930
19931 vkFreeMemory(m_device->device(), mem, NULL);
19932}
19933
19934// This is a positive test. We used to expect error in this case but spec now allows it
19935TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19936 m_errorMonitor->ExpectSuccess();
19937 vk_testing::Fence testFence;
19938 VkFenceCreateInfo fenceInfo = {};
19939 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19940 fenceInfo.pNext = NULL;
19941
Tony Barbour1fa09702017-03-16 12:09:08 -060019942 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019943 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019944 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019945 VkResult result = vkResetFences(m_device->device(), 1, fences);
19946 ASSERT_VK_SUCCESS(result);
19947
19948 m_errorMonitor->VerifyNotFound();
19949}
19950
19951TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19952 m_errorMonitor->ExpectSuccess();
19953
Tony Barbour1fa09702017-03-16 12:09:08 -060019954 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019955 VkResult err;
19956
19957 // Record (empty!) command buffer that can be submitted multiple times
19958 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019959 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19960 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019961 m_commandBuffer->BeginCommandBuffer(&cbbi);
19962 m_commandBuffer->EndCommandBuffer();
19963
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019964 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019965 VkFence fence;
19966 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19967 ASSERT_VK_SUCCESS(err);
19968
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019969 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019970 VkSemaphore s1, s2;
19971 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19972 ASSERT_VK_SUCCESS(err);
19973 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19974 ASSERT_VK_SUCCESS(err);
19975
19976 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019977 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019978 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19979 ASSERT_VK_SUCCESS(err);
19980
19981 // Submit CB again, signaling s2.
19982 si.pSignalSemaphores = &s2;
19983 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19984 ASSERT_VK_SUCCESS(err);
19985
19986 // Wait for fence.
19987 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19988 ASSERT_VK_SUCCESS(err);
19989
19990 // CB is still in flight from second submission, but semaphore s1 is no
19991 // longer in flight. delete it.
19992 vkDestroySemaphore(m_device->device(), s1, nullptr);
19993
19994 m_errorMonitor->VerifyNotFound();
19995
19996 // Force device idle and clean up remaining objects
19997 vkDeviceWaitIdle(m_device->device());
19998 vkDestroySemaphore(m_device->device(), s2, nullptr);
19999 vkDestroyFence(m_device->device(), fence, nullptr);
20000}
20001
20002TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
20003 m_errorMonitor->ExpectSuccess();
20004
Tony Barbour1fa09702017-03-16 12:09:08 -060020005 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020006 VkResult err;
20007
20008 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020009 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020010 VkFence f1;
20011 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20012 ASSERT_VK_SUCCESS(err);
20013
20014 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020015 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020016 VkFence f2;
20017 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20018 ASSERT_VK_SUCCESS(err);
20019
20020 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020021 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020022 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20023
20024 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020025 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020026 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20027
20028 // Should have both retired!
20029 vkDestroyFence(m_device->device(), f1, nullptr);
20030 vkDestroyFence(m_device->device(), f2, nullptr);
20031
20032 m_errorMonitor->VerifyNotFound();
20033}
20034
20035TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020036 TEST_DESCRIPTION(
20037 "Verify that creating an image view from an image with valid usage "
20038 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020039
Tony Barbour1fa09702017-03-16 12:09:08 -060020040 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020041
20042 m_errorMonitor->ExpectSuccess();
20043 // Verify that we can create a view with usage INPUT_ATTACHMENT
20044 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020045 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 -060020046 ASSERT_TRUE(image.initialized());
20047 VkImageView imageView;
20048 VkImageViewCreateInfo ivci = {};
20049 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20050 ivci.image = image.handle();
20051 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20052 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20053 ivci.subresourceRange.layerCount = 1;
20054 ivci.subresourceRange.baseMipLevel = 0;
20055 ivci.subresourceRange.levelCount = 1;
20056 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20057
20058 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20059 m_errorMonitor->VerifyNotFound();
20060 vkDestroyImageView(m_device->device(), imageView, NULL);
20061}
20062
20063// This is a positive test. No failures are expected.
20064TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020065 TEST_DESCRIPTION(
20066 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20067 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020068
Tony Barbour1fa09702017-03-16 12:09:08 -060020069 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020070
20071 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020072 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020073 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020074
20075 m_errorMonitor->ExpectSuccess();
20076
20077 VkImage image;
20078 VkImageCreateInfo image_create_info = {};
20079 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20080 image_create_info.pNext = NULL;
20081 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20082 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20083 image_create_info.extent.width = 64;
20084 image_create_info.extent.height = 64;
20085 image_create_info.extent.depth = 1;
20086 image_create_info.mipLevels = 1;
20087 image_create_info.arrayLayers = 1;
20088 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20089 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20090 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20091 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20092 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20093 ASSERT_VK_SUCCESS(err);
20094
20095 VkMemoryRequirements memory_reqs;
20096 VkDeviceMemory memory_one, memory_two;
20097 bool pass;
20098 VkMemoryAllocateInfo memory_info = {};
20099 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20100 memory_info.pNext = NULL;
20101 memory_info.allocationSize = 0;
20102 memory_info.memoryTypeIndex = 0;
20103 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20104 // Find an image big enough to allow sparse mapping of 2 memory regions
20105 // Increase the image size until it is at least twice the
20106 // size of the required alignment, to ensure we can bind both
20107 // allocated memory blocks to the image on aligned offsets.
20108 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
20109 vkDestroyImage(m_device->device(), image, nullptr);
20110 image_create_info.extent.width *= 2;
20111 image_create_info.extent.height *= 2;
20112 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
20113 ASSERT_VK_SUCCESS(err);
20114 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20115 }
20116 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
20117 // at the end of the first
20118 memory_info.allocationSize = memory_reqs.alignment;
20119 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20120 ASSERT_TRUE(pass);
20121 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
20122 ASSERT_VK_SUCCESS(err);
20123 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
20124 ASSERT_VK_SUCCESS(err);
20125 VkSparseMemoryBind binds[2];
20126 binds[0].flags = 0;
20127 binds[0].memory = memory_one;
20128 binds[0].memoryOffset = 0;
20129 binds[0].resourceOffset = 0;
20130 binds[0].size = memory_info.allocationSize;
20131 binds[1].flags = 0;
20132 binds[1].memory = memory_two;
20133 binds[1].memoryOffset = 0;
20134 binds[1].resourceOffset = memory_info.allocationSize;
20135 binds[1].size = memory_info.allocationSize;
20136
20137 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
20138 opaqueBindInfo.image = image;
20139 opaqueBindInfo.bindCount = 2;
20140 opaqueBindInfo.pBinds = binds;
20141
20142 VkFence fence = VK_NULL_HANDLE;
20143 VkBindSparseInfo bindSparseInfo = {};
20144 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
20145 bindSparseInfo.imageOpaqueBindCount = 1;
20146 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
20147
20148 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
20149 vkQueueWaitIdle(m_device->m_queue);
20150 vkDestroyImage(m_device->device(), image, NULL);
20151 vkFreeMemory(m_device->device(), memory_one, NULL);
20152 vkFreeMemory(m_device->device(), memory_two, NULL);
20153 m_errorMonitor->VerifyNotFound();
20154}
20155
20156TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020157 TEST_DESCRIPTION(
20158 "Ensure that CmdBeginRenderPass with an attachment's "
20159 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
20160 "the command buffer has prior knowledge of that "
20161 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020162
20163 m_errorMonitor->ExpectSuccess();
20164
Tony Barbour1fa09702017-03-16 12:09:08 -060020165 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020166
20167 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020168 VkAttachmentDescription attachment = {0,
20169 VK_FORMAT_R8G8B8A8_UNORM,
20170 VK_SAMPLE_COUNT_1_BIT,
20171 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20172 VK_ATTACHMENT_STORE_OP_STORE,
20173 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20174 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20175 VK_IMAGE_LAYOUT_UNDEFINED,
20176 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020177
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020178 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020179
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020180 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020181
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020182 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020183
20184 VkRenderPass rp;
20185 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20186 ASSERT_VK_SUCCESS(err);
20187
20188 // A compatible framebuffer.
20189 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020190 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 -060020191 ASSERT_TRUE(image.initialized());
20192
20193 VkImageViewCreateInfo ivci = {
20194 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20195 nullptr,
20196 0,
20197 image.handle(),
20198 VK_IMAGE_VIEW_TYPE_2D,
20199 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020200 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20201 VK_COMPONENT_SWIZZLE_IDENTITY},
20202 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020203 };
20204 VkImageView view;
20205 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20206 ASSERT_VK_SUCCESS(err);
20207
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020208 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020209 VkFramebuffer fb;
20210 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20211 ASSERT_VK_SUCCESS(err);
20212
20213 // Record a single command buffer which uses this renderpass twice. The
20214 // bug is triggered at the beginning of the second renderpass, when the
20215 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020216 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 -070020217 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020218 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20219 vkCmdEndRenderPass(m_commandBuffer->handle());
20220 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20221
20222 m_errorMonitor->VerifyNotFound();
20223
20224 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020225 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020226
20227 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20228 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20229 vkDestroyImageView(m_device->device(), view, nullptr);
20230}
20231
20232TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020233 TEST_DESCRIPTION(
20234 "This test should pass. Create a Framebuffer and "
20235 "command buffer, bind them together, then destroy "
20236 "command pool and framebuffer and verify there are no "
20237 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020238
20239 m_errorMonitor->ExpectSuccess();
20240
Tony Barbour1fa09702017-03-16 12:09:08 -060020241 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020242
20243 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020244 VkAttachmentDescription attachment = {0,
20245 VK_FORMAT_R8G8B8A8_UNORM,
20246 VK_SAMPLE_COUNT_1_BIT,
20247 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20248 VK_ATTACHMENT_STORE_OP_STORE,
20249 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20250 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20251 VK_IMAGE_LAYOUT_UNDEFINED,
20252 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020253
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020254 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020255
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020256 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020257
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020258 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020259
20260 VkRenderPass rp;
20261 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20262 ASSERT_VK_SUCCESS(err);
20263
20264 // A compatible framebuffer.
20265 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020266 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 -060020267 ASSERT_TRUE(image.initialized());
20268
20269 VkImageViewCreateInfo ivci = {
20270 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20271 nullptr,
20272 0,
20273 image.handle(),
20274 VK_IMAGE_VIEW_TYPE_2D,
20275 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020276 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20277 VK_COMPONENT_SWIZZLE_IDENTITY},
20278 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020279 };
20280 VkImageView view;
20281 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20282 ASSERT_VK_SUCCESS(err);
20283
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020284 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020285 VkFramebuffer fb;
20286 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20287 ASSERT_VK_SUCCESS(err);
20288
20289 // Explicitly create a command buffer to bind the FB to so that we can then
20290 // destroy the command pool in order to implicitly free command buffer
20291 VkCommandPool command_pool;
20292 VkCommandPoolCreateInfo pool_create_info{};
20293 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20294 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20295 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20296 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20297
20298 VkCommandBuffer command_buffer;
20299 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20300 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20301 command_buffer_allocate_info.commandPool = command_pool;
20302 command_buffer_allocate_info.commandBufferCount = 1;
20303 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20304 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20305
20306 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020307 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 -060020308 VkCommandBufferBeginInfo begin_info{};
20309 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20310 vkBeginCommandBuffer(command_buffer, &begin_info);
20311
20312 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20313 vkCmdEndRenderPass(command_buffer);
20314 vkEndCommandBuffer(command_buffer);
20315 vkDestroyImageView(m_device->device(), view, nullptr);
20316 // Destroy command pool to implicitly free command buffer
20317 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20318 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20319 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20320 m_errorMonitor->VerifyNotFound();
20321}
20322
20323TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020324 TEST_DESCRIPTION(
20325 "Ensure that CmdBeginRenderPass applies the layout "
20326 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020327
20328 m_errorMonitor->ExpectSuccess();
20329
Tony Barbour1fa09702017-03-16 12:09:08 -060020330 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020331
20332 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020333 VkAttachmentDescription attachment = {0,
20334 VK_FORMAT_R8G8B8A8_UNORM,
20335 VK_SAMPLE_COUNT_1_BIT,
20336 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20337 VK_ATTACHMENT_STORE_OP_STORE,
20338 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20339 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20340 VK_IMAGE_LAYOUT_UNDEFINED,
20341 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020342
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020343 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020344
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020345 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020346
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020347 VkSubpassDependency dep = {0,
20348 0,
20349 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20350 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20351 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20352 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20353 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020354
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020355 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020356
20357 VkResult err;
20358 VkRenderPass rp;
20359 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20360 ASSERT_VK_SUCCESS(err);
20361
20362 // A compatible framebuffer.
20363 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020364 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 -060020365 ASSERT_TRUE(image.initialized());
20366
20367 VkImageViewCreateInfo ivci = {
20368 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20369 nullptr,
20370 0,
20371 image.handle(),
20372 VK_IMAGE_VIEW_TYPE_2D,
20373 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020374 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20375 VK_COMPONENT_SWIZZLE_IDENTITY},
20376 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020377 };
20378 VkImageView view;
20379 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20380 ASSERT_VK_SUCCESS(err);
20381
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020382 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020383 VkFramebuffer fb;
20384 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20385 ASSERT_VK_SUCCESS(err);
20386
20387 // Record a single command buffer which issues a pipeline barrier w/
20388 // image memory barrier for the attachment. This detects the previously
20389 // missing tracking of the subpass layout by throwing a validation error
20390 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020391 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 -070020392 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020393 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20394
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020395 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20396 nullptr,
20397 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20398 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20399 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20400 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20401 VK_QUEUE_FAMILY_IGNORED,
20402 VK_QUEUE_FAMILY_IGNORED,
20403 image.handle(),
20404 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020405 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020406 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20407 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020408
20409 vkCmdEndRenderPass(m_commandBuffer->handle());
20410 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020411 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020412
20413 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20414 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20415 vkDestroyImageView(m_device->device(), view, nullptr);
20416}
20417
20418TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020419 TEST_DESCRIPTION(
20420 "Validate that when an imageView of a depth/stencil image "
20421 "is used as a depth/stencil framebuffer attachment, the "
20422 "aspectMask is ignored and both depth and stencil image "
20423 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020424
Tony Barbour1fa09702017-03-16 12:09:08 -060020425 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020426 VkFormatProperties format_properties;
20427 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20428 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20429 return;
20430 }
20431
20432 m_errorMonitor->ExpectSuccess();
20433
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020434 VkAttachmentDescription attachment = {0,
20435 VK_FORMAT_D32_SFLOAT_S8_UINT,
20436 VK_SAMPLE_COUNT_1_BIT,
20437 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20438 VK_ATTACHMENT_STORE_OP_STORE,
20439 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20440 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20441 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20442 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020443
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020444 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020445
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020446 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020447
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020448 VkSubpassDependency dep = {0,
20449 0,
20450 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20451 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20452 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20453 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20454 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020455
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020456 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020457
20458 VkResult err;
20459 VkRenderPass rp;
20460 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20461 ASSERT_VK_SUCCESS(err);
20462
20463 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020464 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
20465 0x26, // usage
20466 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020467 ASSERT_TRUE(image.initialized());
20468 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20469
20470 VkImageViewCreateInfo ivci = {
20471 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20472 nullptr,
20473 0,
20474 image.handle(),
20475 VK_IMAGE_VIEW_TYPE_2D,
20476 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020477 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20478 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020479 };
20480 VkImageView view;
20481 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20482 ASSERT_VK_SUCCESS(err);
20483
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020484 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020485 VkFramebuffer fb;
20486 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20487 ASSERT_VK_SUCCESS(err);
20488
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020489 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 -070020490 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020491 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20492
20493 VkImageMemoryBarrier imb = {};
20494 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20495 imb.pNext = nullptr;
20496 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20497 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20498 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20499 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20500 imb.srcQueueFamilyIndex = 0;
20501 imb.dstQueueFamilyIndex = 0;
20502 imb.image = image.handle();
20503 imb.subresourceRange.aspectMask = 0x6;
20504 imb.subresourceRange.baseMipLevel = 0;
20505 imb.subresourceRange.levelCount = 0x1;
20506 imb.subresourceRange.baseArrayLayer = 0;
20507 imb.subresourceRange.layerCount = 0x1;
20508
20509 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020510 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20511 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020512
20513 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020514 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020515 QueueCommandBuffer(false);
20516 m_errorMonitor->VerifyNotFound();
20517
20518 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20519 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20520 vkDestroyImageView(m_device->device(), view, nullptr);
20521}
20522
20523TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020524 TEST_DESCRIPTION(
20525 "Ensure that layout transitions work correctly without "
20526 "errors, when an attachment reference is "
20527 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020528
20529 m_errorMonitor->ExpectSuccess();
20530
Tony Barbour1fa09702017-03-16 12:09:08 -060020531 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020532
20533 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020534 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020535
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020536 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020537
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020538 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020539
20540 VkRenderPass rp;
20541 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20542 ASSERT_VK_SUCCESS(err);
20543
20544 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020545 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020546 VkFramebuffer fb;
20547 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20548 ASSERT_VK_SUCCESS(err);
20549
20550 // Record a command buffer which just begins and ends the renderpass. The
20551 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020552 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 -070020553 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020554 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20555 vkCmdEndRenderPass(m_commandBuffer->handle());
20556 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020557 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020558
20559 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20560 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20561}
20562
20563// This is a positive test. No errors are expected.
20564TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020565 TEST_DESCRIPTION(
20566 "Create a stencil-only attachment with a LOAD_OP set to "
20567 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020568 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020569 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020570 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020571 if (!depth_format) {
20572 printf(" No Depth + Stencil format found. Skipped.\n");
20573 return;
20574 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020575 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020576 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020577 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20578 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020579 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20580 return;
20581 }
20582
Tony Barbourf887b162017-03-09 10:06:46 -070020583 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020584 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020585 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020586 VkAttachmentDescription att = {};
20587 VkAttachmentReference ref = {};
20588 att.format = depth_stencil_fmt;
20589 att.samples = VK_SAMPLE_COUNT_1_BIT;
20590 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20591 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20592 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20593 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20594 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20595 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20596
20597 VkClearValue clear;
20598 clear.depthStencil.depth = 1.0;
20599 clear.depthStencil.stencil = 0;
20600 ref.attachment = 0;
20601 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20602
20603 VkSubpassDescription subpass = {};
20604 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20605 subpass.flags = 0;
20606 subpass.inputAttachmentCount = 0;
20607 subpass.pInputAttachments = NULL;
20608 subpass.colorAttachmentCount = 0;
20609 subpass.pColorAttachments = NULL;
20610 subpass.pResolveAttachments = NULL;
20611 subpass.pDepthStencilAttachment = &ref;
20612 subpass.preserveAttachmentCount = 0;
20613 subpass.pPreserveAttachments = NULL;
20614
20615 VkRenderPass rp;
20616 VkRenderPassCreateInfo rp_info = {};
20617 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20618 rp_info.attachmentCount = 1;
20619 rp_info.pAttachments = &att;
20620 rp_info.subpassCount = 1;
20621 rp_info.pSubpasses = &subpass;
20622 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20623 ASSERT_VK_SUCCESS(result);
20624
20625 VkImageView *depthView = m_depthStencil->BindInfo();
20626 VkFramebufferCreateInfo fb_info = {};
20627 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20628 fb_info.pNext = NULL;
20629 fb_info.renderPass = rp;
20630 fb_info.attachmentCount = 1;
20631 fb_info.pAttachments = depthView;
20632 fb_info.width = 100;
20633 fb_info.height = 100;
20634 fb_info.layers = 1;
20635 VkFramebuffer fb;
20636 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20637 ASSERT_VK_SUCCESS(result);
20638
20639 VkRenderPassBeginInfo rpbinfo = {};
20640 rpbinfo.clearValueCount = 1;
20641 rpbinfo.pClearValues = &clear;
20642 rpbinfo.pNext = NULL;
20643 rpbinfo.renderPass = rp;
20644 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20645 rpbinfo.renderArea.extent.width = 100;
20646 rpbinfo.renderArea.extent.height = 100;
20647 rpbinfo.renderArea.offset.x = 0;
20648 rpbinfo.renderArea.offset.y = 0;
20649 rpbinfo.framebuffer = fb;
20650
20651 VkFence fence = {};
20652 VkFenceCreateInfo fence_ci = {};
20653 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20654 fence_ci.pNext = nullptr;
20655 fence_ci.flags = 0;
20656 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20657 ASSERT_VK_SUCCESS(result);
20658
20659 m_commandBuffer->BeginCommandBuffer();
20660 m_commandBuffer->BeginRenderPass(rpbinfo);
20661 m_commandBuffer->EndRenderPass();
20662 m_commandBuffer->EndCommandBuffer();
20663 m_commandBuffer->QueueCommandBuffer(fence);
20664
20665 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020666 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 -070020667 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020668 VkImageMemoryBarrier barrier = {};
20669 VkImageSubresourceRange range;
20670 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20671 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20672 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20673 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20674 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20675 barrier.image = m_depthStencil->handle();
20676 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20677 range.baseMipLevel = 0;
20678 range.levelCount = 1;
20679 range.baseArrayLayer = 0;
20680 range.layerCount = 1;
20681 barrier.subresourceRange = range;
20682 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20683 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20684 cmdbuf.BeginCommandBuffer();
20685 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 -070020686 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020687 barrier.srcAccessMask = 0;
20688 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20689 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20690 barrier.image = destImage.handle();
20691 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20692 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 -070020693 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020694 VkImageCopy cregion;
20695 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20696 cregion.srcSubresource.mipLevel = 0;
20697 cregion.srcSubresource.baseArrayLayer = 0;
20698 cregion.srcSubresource.layerCount = 1;
20699 cregion.srcOffset.x = 0;
20700 cregion.srcOffset.y = 0;
20701 cregion.srcOffset.z = 0;
20702 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20703 cregion.dstSubresource.mipLevel = 0;
20704 cregion.dstSubresource.baseArrayLayer = 0;
20705 cregion.dstSubresource.layerCount = 1;
20706 cregion.dstOffset.x = 0;
20707 cregion.dstOffset.y = 0;
20708 cregion.dstOffset.z = 0;
20709 cregion.extent.width = 100;
20710 cregion.extent.height = 100;
20711 cregion.extent.depth = 1;
20712 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020713 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020714 cmdbuf.EndCommandBuffer();
20715
20716 VkSubmitInfo submit_info;
20717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20718 submit_info.pNext = NULL;
20719 submit_info.waitSemaphoreCount = 0;
20720 submit_info.pWaitSemaphores = NULL;
20721 submit_info.pWaitDstStageMask = NULL;
20722 submit_info.commandBufferCount = 1;
20723 submit_info.pCommandBuffers = &cmdbuf.handle();
20724 submit_info.signalSemaphoreCount = 0;
20725 submit_info.pSignalSemaphores = NULL;
20726
20727 m_errorMonitor->ExpectSuccess();
20728 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20729 m_errorMonitor->VerifyNotFound();
20730
20731 vkQueueWaitIdle(m_device->m_queue);
20732 vkDestroyFence(m_device->device(), fence, nullptr);
20733 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20734 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20735}
20736
20737// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020738TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20739 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20740
20741 m_errorMonitor->ExpectSuccess();
20742
Tony Barbour1fa09702017-03-16 12:09:08 -060020743 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020744 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020745 if (!depth_format) {
20746 printf(" No Depth + Stencil format found. Skipped.\n");
20747 return;
20748 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020749 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20750
20751 VkImageMemoryBarrier img_barrier = {};
20752 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20753 img_barrier.pNext = NULL;
20754 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20755 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20756 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20757 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20758 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20759 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20760 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20761 img_barrier.subresourceRange.baseArrayLayer = 0;
20762 img_barrier.subresourceRange.baseMipLevel = 0;
20763 img_barrier.subresourceRange.layerCount = 1;
20764 img_barrier.subresourceRange.levelCount = 1;
20765
20766 {
20767 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020768 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 -070020769 ASSERT_TRUE(img_color.initialized());
20770
20771 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020772 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 -070020773 ASSERT_TRUE(img_ds1.initialized());
20774
20775 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020776 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 -070020777 ASSERT_TRUE(img_ds2.initialized());
20778
20779 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020780 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 -070020781 ASSERT_TRUE(img_xfer_src.initialized());
20782
20783 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020784 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 -070020785 ASSERT_TRUE(img_xfer_dst.initialized());
20786
20787 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020788 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 -070020789 ASSERT_TRUE(img_sampled.initialized());
20790
20791 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020792 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 -070020793 ASSERT_TRUE(img_input.initialized());
20794
20795 const struct {
20796 VkImageObj &image_obj;
20797 VkImageLayout old_layout;
20798 VkImageLayout new_layout;
20799 } buffer_layouts[] = {
20800 // clang-format off
20801 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20802 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20803 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20804 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20805 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20806 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20807 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20808 // clang-format on
20809 };
20810 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20811
20812 m_commandBuffer->BeginCommandBuffer();
20813 for (uint32_t i = 0; i < layout_count; ++i) {
20814 img_barrier.image = buffer_layouts[i].image_obj.handle();
20815 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20816 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20817 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20818 : VK_IMAGE_ASPECT_COLOR_BIT;
20819
20820 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20821 img_barrier.newLayout = buffer_layouts[i].new_layout;
20822 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20823 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20824
20825 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20826 img_barrier.newLayout = buffer_layouts[i].old_layout;
20827 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20828 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20829 }
20830 m_commandBuffer->EndCommandBuffer();
20831
20832 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20833 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20834 }
20835 m_errorMonitor->VerifyNotFound();
20836}
20837
20838// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020839TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20840 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20841
20842 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020843 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020844
20845 VkEvent event;
20846 VkEventCreateInfo event_create_info{};
20847 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20848 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20849
20850 VkCommandPool command_pool;
20851 VkCommandPoolCreateInfo pool_create_info{};
20852 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20853 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20854 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20855 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20856
20857 VkCommandBuffer command_buffer;
20858 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20859 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20860 command_buffer_allocate_info.commandPool = command_pool;
20861 command_buffer_allocate_info.commandBufferCount = 1;
20862 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20863 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20864
20865 VkQueue queue = VK_NULL_HANDLE;
20866 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20867
20868 {
20869 VkCommandBufferBeginInfo begin_info{};
20870 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20871 vkBeginCommandBuffer(command_buffer, &begin_info);
20872
20873 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 -070020874 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020875 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20876 vkEndCommandBuffer(command_buffer);
20877 }
20878 {
20879 VkSubmitInfo submit_info{};
20880 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20881 submit_info.commandBufferCount = 1;
20882 submit_info.pCommandBuffers = &command_buffer;
20883 submit_info.signalSemaphoreCount = 0;
20884 submit_info.pSignalSemaphores = nullptr;
20885 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20886 }
20887 { vkSetEvent(m_device->device(), event); }
20888
20889 vkQueueWaitIdle(queue);
20890
20891 vkDestroyEvent(m_device->device(), event, nullptr);
20892 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20893 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20894
20895 m_errorMonitor->VerifyNotFound();
20896}
20897// This is a positive test. No errors should be generated.
20898TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20899 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20900
Tony Barbour1fa09702017-03-16 12:09:08 -060020901 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020902 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020903
20904 m_errorMonitor->ExpectSuccess();
20905
20906 VkQueryPool query_pool;
20907 VkQueryPoolCreateInfo query_pool_create_info{};
20908 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20909 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20910 query_pool_create_info.queryCount = 1;
20911 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20912
20913 VkCommandPool command_pool;
20914 VkCommandPoolCreateInfo pool_create_info{};
20915 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20916 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20917 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20918 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20919
20920 VkCommandBuffer command_buffer;
20921 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20922 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20923 command_buffer_allocate_info.commandPool = command_pool;
20924 command_buffer_allocate_info.commandBufferCount = 1;
20925 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20926 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20927
20928 VkCommandBuffer secondary_command_buffer;
20929 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20930 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20931
20932 VkQueue queue = VK_NULL_HANDLE;
20933 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20934
20935 uint32_t qfi = 0;
20936 VkBufferCreateInfo buff_create_info = {};
20937 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20938 buff_create_info.size = 1024;
20939 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20940 buff_create_info.queueFamilyIndexCount = 1;
20941 buff_create_info.pQueueFamilyIndices = &qfi;
20942
20943 VkResult err;
20944 VkBuffer buffer;
20945 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20946 ASSERT_VK_SUCCESS(err);
20947 VkMemoryAllocateInfo mem_alloc = {};
20948 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20949 mem_alloc.pNext = NULL;
20950 mem_alloc.allocationSize = 1024;
20951 mem_alloc.memoryTypeIndex = 0;
20952
20953 VkMemoryRequirements memReqs;
20954 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20955 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20956 if (!pass) {
20957 vkDestroyBuffer(m_device->device(), buffer, NULL);
20958 return;
20959 }
20960
20961 VkDeviceMemory mem;
20962 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20963 ASSERT_VK_SUCCESS(err);
20964 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20965 ASSERT_VK_SUCCESS(err);
20966
20967 VkCommandBufferInheritanceInfo hinfo = {};
20968 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20969 hinfo.renderPass = VK_NULL_HANDLE;
20970 hinfo.subpass = 0;
20971 hinfo.framebuffer = VK_NULL_HANDLE;
20972 hinfo.occlusionQueryEnable = VK_FALSE;
20973 hinfo.queryFlags = 0;
20974 hinfo.pipelineStatistics = 0;
20975
20976 {
20977 VkCommandBufferBeginInfo begin_info{};
20978 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20979 begin_info.pInheritanceInfo = &hinfo;
20980 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20981
20982 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20983 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20984
20985 vkEndCommandBuffer(secondary_command_buffer);
20986
20987 begin_info.pInheritanceInfo = nullptr;
20988 vkBeginCommandBuffer(command_buffer, &begin_info);
20989
20990 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20991 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20992
20993 vkEndCommandBuffer(command_buffer);
20994 }
20995 {
20996 VkSubmitInfo submit_info{};
20997 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20998 submit_info.commandBufferCount = 1;
20999 submit_info.pCommandBuffers = &command_buffer;
21000 submit_info.signalSemaphoreCount = 0;
21001 submit_info.pSignalSemaphores = nullptr;
21002 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21003 }
21004
21005 vkQueueWaitIdle(queue);
21006
21007 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21008 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21009 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21010 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21011 vkDestroyBuffer(m_device->device(), buffer, NULL);
21012 vkFreeMemory(m_device->device(), mem, NULL);
21013
21014 m_errorMonitor->VerifyNotFound();
21015}
21016
21017// This is a positive test. No errors should be generated.
21018TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21019 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21020
Tony Barbour1fa09702017-03-16 12:09:08 -060021021 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021022 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021023
21024 m_errorMonitor->ExpectSuccess();
21025
21026 VkQueryPool query_pool;
21027 VkQueryPoolCreateInfo query_pool_create_info{};
21028 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21029 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21030 query_pool_create_info.queryCount = 1;
21031 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21032
21033 VkCommandPool command_pool;
21034 VkCommandPoolCreateInfo pool_create_info{};
21035 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21036 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21037 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21038 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21039
21040 VkCommandBuffer command_buffer[2];
21041 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21042 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21043 command_buffer_allocate_info.commandPool = command_pool;
21044 command_buffer_allocate_info.commandBufferCount = 2;
21045 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21046 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21047
21048 VkQueue queue = VK_NULL_HANDLE;
21049 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21050
21051 uint32_t qfi = 0;
21052 VkBufferCreateInfo buff_create_info = {};
21053 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21054 buff_create_info.size = 1024;
21055 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21056 buff_create_info.queueFamilyIndexCount = 1;
21057 buff_create_info.pQueueFamilyIndices = &qfi;
21058
21059 VkResult err;
21060 VkBuffer buffer;
21061 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21062 ASSERT_VK_SUCCESS(err);
21063 VkMemoryAllocateInfo mem_alloc = {};
21064 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21065 mem_alloc.pNext = NULL;
21066 mem_alloc.allocationSize = 1024;
21067 mem_alloc.memoryTypeIndex = 0;
21068
21069 VkMemoryRequirements memReqs;
21070 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21071 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21072 if (!pass) {
21073 vkDestroyBuffer(m_device->device(), buffer, NULL);
21074 return;
21075 }
21076
21077 VkDeviceMemory mem;
21078 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21079 ASSERT_VK_SUCCESS(err);
21080 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21081 ASSERT_VK_SUCCESS(err);
21082
21083 {
21084 VkCommandBufferBeginInfo begin_info{};
21085 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21086 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21087
21088 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21089 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21090
21091 vkEndCommandBuffer(command_buffer[0]);
21092
21093 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21094
21095 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21096
21097 vkEndCommandBuffer(command_buffer[1]);
21098 }
21099 {
21100 VkSubmitInfo submit_info{};
21101 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21102 submit_info.commandBufferCount = 2;
21103 submit_info.pCommandBuffers = command_buffer;
21104 submit_info.signalSemaphoreCount = 0;
21105 submit_info.pSignalSemaphores = nullptr;
21106 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21107 }
21108
21109 vkQueueWaitIdle(queue);
21110
21111 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21112 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
21113 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21114 vkDestroyBuffer(m_device->device(), buffer, NULL);
21115 vkFreeMemory(m_device->device(), mem, NULL);
21116
21117 m_errorMonitor->VerifyNotFound();
21118}
21119
Tony Barbourc46924f2016-11-04 11:49:52 -060021120TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021121 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
21122
Tony Barbour1fa09702017-03-16 12:09:08 -060021123 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021124 VkEvent event;
21125 VkEventCreateInfo event_create_info{};
21126 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21127 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21128
21129 VkCommandPool command_pool;
21130 VkCommandPoolCreateInfo pool_create_info{};
21131 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21132 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21133 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21134 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21135
21136 VkCommandBuffer command_buffer;
21137 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21138 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21139 command_buffer_allocate_info.commandPool = command_pool;
21140 command_buffer_allocate_info.commandBufferCount = 1;
21141 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21142 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21143
21144 VkQueue queue = VK_NULL_HANDLE;
21145 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21146
21147 {
21148 VkCommandBufferBeginInfo begin_info{};
21149 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21150 vkBeginCommandBuffer(command_buffer, &begin_info);
21151
21152 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021153 vkEndCommandBuffer(command_buffer);
21154 }
21155 {
21156 VkSubmitInfo submit_info{};
21157 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21158 submit_info.commandBufferCount = 1;
21159 submit_info.pCommandBuffers = &command_buffer;
21160 submit_info.signalSemaphoreCount = 0;
21161 submit_info.pSignalSemaphores = nullptr;
21162 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21163 }
21164 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
21166 "that is already in use by a "
21167 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021168 vkSetEvent(m_device->device(), event);
21169 m_errorMonitor->VerifyFound();
21170 }
21171
21172 vkQueueWaitIdle(queue);
21173
21174 vkDestroyEvent(m_device->device(), event, nullptr);
21175 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21176 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21177}
21178
21179// This is a positive test. No errors should be generated.
21180TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021181 TEST_DESCRIPTION(
21182 "Two command buffers with two separate fences are each "
21183 "run through a Submit & WaitForFences cycle 3 times. This "
21184 "previously revealed a bug so running this positive test "
21185 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021186 m_errorMonitor->ExpectSuccess();
21187
Tony Barbour1fa09702017-03-16 12:09:08 -060021188 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021189 VkQueue queue = VK_NULL_HANDLE;
21190 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21191
21192 static const uint32_t NUM_OBJECTS = 2;
21193 static const uint32_t NUM_FRAMES = 3;
21194 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
21195 VkFence fences[NUM_OBJECTS] = {};
21196
21197 VkCommandPool cmd_pool;
21198 VkCommandPoolCreateInfo cmd_pool_ci = {};
21199 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21200 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
21201 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21202 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
21203 ASSERT_VK_SUCCESS(err);
21204
21205 VkCommandBufferAllocateInfo cmd_buf_info = {};
21206 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21207 cmd_buf_info.commandPool = cmd_pool;
21208 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21209 cmd_buf_info.commandBufferCount = 1;
21210
21211 VkFenceCreateInfo fence_ci = {};
21212 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21213 fence_ci.pNext = nullptr;
21214 fence_ci.flags = 0;
21215
21216 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21217 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
21218 ASSERT_VK_SUCCESS(err);
21219 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
21220 ASSERT_VK_SUCCESS(err);
21221 }
21222
21223 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
21224 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
21225 // Create empty cmd buffer
21226 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
21227 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21228
21229 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
21230 ASSERT_VK_SUCCESS(err);
21231 err = vkEndCommandBuffer(cmd_buffers[obj]);
21232 ASSERT_VK_SUCCESS(err);
21233
21234 VkSubmitInfo submit_info = {};
21235 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21236 submit_info.commandBufferCount = 1;
21237 submit_info.pCommandBuffers = &cmd_buffers[obj];
21238 // Submit cmd buffer and wait for fence
21239 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
21240 ASSERT_VK_SUCCESS(err);
21241 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21242 ASSERT_VK_SUCCESS(err);
21243 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21244 ASSERT_VK_SUCCESS(err);
21245 }
21246 }
21247 m_errorMonitor->VerifyNotFound();
21248 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21249 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21250 vkDestroyFence(m_device->device(), fences[i], nullptr);
21251 }
21252}
21253// This is a positive test. No errors should be generated.
21254TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021255 TEST_DESCRIPTION(
21256 "Two command buffers, each in a separate QueueSubmit call "
21257 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021258
Tony Barbour1fa09702017-03-16 12:09:08 -060021259 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021260 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021261
21262 m_errorMonitor->ExpectSuccess();
21263
21264 VkSemaphore semaphore;
21265 VkSemaphoreCreateInfo semaphore_create_info{};
21266 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21267 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21268
21269 VkCommandPool command_pool;
21270 VkCommandPoolCreateInfo pool_create_info{};
21271 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21272 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21273 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21274 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21275
21276 VkCommandBuffer command_buffer[2];
21277 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21278 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21279 command_buffer_allocate_info.commandPool = command_pool;
21280 command_buffer_allocate_info.commandBufferCount = 2;
21281 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21282 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21283
21284 VkQueue queue = VK_NULL_HANDLE;
21285 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21286
21287 {
21288 VkCommandBufferBeginInfo begin_info{};
21289 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21290 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21291
21292 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 -070021293 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021294
21295 VkViewport viewport{};
21296 viewport.maxDepth = 1.0f;
21297 viewport.minDepth = 0.0f;
21298 viewport.width = 512;
21299 viewport.height = 512;
21300 viewport.x = 0;
21301 viewport.y = 0;
21302 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21303 vkEndCommandBuffer(command_buffer[0]);
21304 }
21305 {
21306 VkCommandBufferBeginInfo begin_info{};
21307 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21308 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21309
21310 VkViewport viewport{};
21311 viewport.maxDepth = 1.0f;
21312 viewport.minDepth = 0.0f;
21313 viewport.width = 512;
21314 viewport.height = 512;
21315 viewport.x = 0;
21316 viewport.y = 0;
21317 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21318 vkEndCommandBuffer(command_buffer[1]);
21319 }
21320 {
21321 VkSubmitInfo submit_info{};
21322 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21323 submit_info.commandBufferCount = 1;
21324 submit_info.pCommandBuffers = &command_buffer[0];
21325 submit_info.signalSemaphoreCount = 1;
21326 submit_info.pSignalSemaphores = &semaphore;
21327 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21328 }
21329 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021330 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021331 VkSubmitInfo submit_info{};
21332 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21333 submit_info.commandBufferCount = 1;
21334 submit_info.pCommandBuffers = &command_buffer[1];
21335 submit_info.waitSemaphoreCount = 1;
21336 submit_info.pWaitSemaphores = &semaphore;
21337 submit_info.pWaitDstStageMask = flags;
21338 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21339 }
21340
21341 vkQueueWaitIdle(m_device->m_queue);
21342
21343 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21344 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21345 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21346
21347 m_errorMonitor->VerifyNotFound();
21348}
21349
21350// This is a positive test. No errors should be generated.
21351TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021352 TEST_DESCRIPTION(
21353 "Two command buffers, each in a separate QueueSubmit call "
21354 "submitted on separate queues, the second having a fence"
21355 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021356
Tony Barbour1fa09702017-03-16 12:09:08 -060021357 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021358 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021359
21360 m_errorMonitor->ExpectSuccess();
21361
21362 VkFence fence;
21363 VkFenceCreateInfo fence_create_info{};
21364 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21365 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21366
21367 VkSemaphore semaphore;
21368 VkSemaphoreCreateInfo semaphore_create_info{};
21369 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21370 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21371
21372 VkCommandPool command_pool;
21373 VkCommandPoolCreateInfo pool_create_info{};
21374 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21375 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21376 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21377 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21378
21379 VkCommandBuffer command_buffer[2];
21380 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21381 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21382 command_buffer_allocate_info.commandPool = command_pool;
21383 command_buffer_allocate_info.commandBufferCount = 2;
21384 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21385 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21386
21387 VkQueue queue = VK_NULL_HANDLE;
21388 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21389
21390 {
21391 VkCommandBufferBeginInfo begin_info{};
21392 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21393 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21394
21395 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021396 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021397
21398 VkViewport viewport{};
21399 viewport.maxDepth = 1.0f;
21400 viewport.minDepth = 0.0f;
21401 viewport.width = 512;
21402 viewport.height = 512;
21403 viewport.x = 0;
21404 viewport.y = 0;
21405 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21406 vkEndCommandBuffer(command_buffer[0]);
21407 }
21408 {
21409 VkCommandBufferBeginInfo begin_info{};
21410 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21411 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21412
21413 VkViewport viewport{};
21414 viewport.maxDepth = 1.0f;
21415 viewport.minDepth = 0.0f;
21416 viewport.width = 512;
21417 viewport.height = 512;
21418 viewport.x = 0;
21419 viewport.y = 0;
21420 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21421 vkEndCommandBuffer(command_buffer[1]);
21422 }
21423 {
21424 VkSubmitInfo submit_info{};
21425 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21426 submit_info.commandBufferCount = 1;
21427 submit_info.pCommandBuffers = &command_buffer[0];
21428 submit_info.signalSemaphoreCount = 1;
21429 submit_info.pSignalSemaphores = &semaphore;
21430 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21431 }
21432 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021433 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021434 VkSubmitInfo submit_info{};
21435 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21436 submit_info.commandBufferCount = 1;
21437 submit_info.pCommandBuffers = &command_buffer[1];
21438 submit_info.waitSemaphoreCount = 1;
21439 submit_info.pWaitSemaphores = &semaphore;
21440 submit_info.pWaitDstStageMask = flags;
21441 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21442 }
21443
21444 vkQueueWaitIdle(m_device->m_queue);
21445
21446 vkDestroyFence(m_device->device(), fence, nullptr);
21447 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21448 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21449 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21450
21451 m_errorMonitor->VerifyNotFound();
21452}
21453
21454// This is a positive test. No errors should be generated.
21455TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021456 TEST_DESCRIPTION(
21457 "Two command buffers, each in a separate QueueSubmit call "
21458 "submitted on separate queues, the second having a fence"
21459 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021460
Tony Barbour1fa09702017-03-16 12:09:08 -060021461 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021462 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021463
21464 m_errorMonitor->ExpectSuccess();
21465
21466 VkFence fence;
21467 VkFenceCreateInfo fence_create_info{};
21468 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21469 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21470
21471 VkSemaphore semaphore;
21472 VkSemaphoreCreateInfo semaphore_create_info{};
21473 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21474 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21475
21476 VkCommandPool command_pool;
21477 VkCommandPoolCreateInfo pool_create_info{};
21478 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21479 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21480 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21481 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21482
21483 VkCommandBuffer command_buffer[2];
21484 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21485 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21486 command_buffer_allocate_info.commandPool = command_pool;
21487 command_buffer_allocate_info.commandBufferCount = 2;
21488 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21489 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21490
21491 VkQueue queue = VK_NULL_HANDLE;
21492 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21493
21494 {
21495 VkCommandBufferBeginInfo begin_info{};
21496 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21497 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21498
21499 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 -070021500 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021501
21502 VkViewport viewport{};
21503 viewport.maxDepth = 1.0f;
21504 viewport.minDepth = 0.0f;
21505 viewport.width = 512;
21506 viewport.height = 512;
21507 viewport.x = 0;
21508 viewport.y = 0;
21509 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21510 vkEndCommandBuffer(command_buffer[0]);
21511 }
21512 {
21513 VkCommandBufferBeginInfo begin_info{};
21514 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21515 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21516
21517 VkViewport viewport{};
21518 viewport.maxDepth = 1.0f;
21519 viewport.minDepth = 0.0f;
21520 viewport.width = 512;
21521 viewport.height = 512;
21522 viewport.x = 0;
21523 viewport.y = 0;
21524 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21525 vkEndCommandBuffer(command_buffer[1]);
21526 }
21527 {
21528 VkSubmitInfo submit_info{};
21529 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21530 submit_info.commandBufferCount = 1;
21531 submit_info.pCommandBuffers = &command_buffer[0];
21532 submit_info.signalSemaphoreCount = 1;
21533 submit_info.pSignalSemaphores = &semaphore;
21534 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21535 }
21536 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021537 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021538 VkSubmitInfo submit_info{};
21539 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21540 submit_info.commandBufferCount = 1;
21541 submit_info.pCommandBuffers = &command_buffer[1];
21542 submit_info.waitSemaphoreCount = 1;
21543 submit_info.pWaitSemaphores = &semaphore;
21544 submit_info.pWaitDstStageMask = flags;
21545 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21546 }
21547
21548 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21549 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21550
21551 vkDestroyFence(m_device->device(), fence, nullptr);
21552 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21553 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21554 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21555
21556 m_errorMonitor->VerifyNotFound();
21557}
21558
21559TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021560 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021561 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021562 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021563 return;
21564 }
21565
21566 VkResult err;
21567
21568 m_errorMonitor->ExpectSuccess();
21569
21570 VkQueue q0 = m_device->m_queue;
21571 VkQueue q1 = nullptr;
21572 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21573 ASSERT_NE(q1, nullptr);
21574
21575 // An (empty) command buffer. We must have work in the first submission --
21576 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021577 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021578 VkCommandPool pool;
21579 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21580 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021581 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21582 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021583 VkCommandBuffer cb;
21584 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21585 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021586 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021587 err = vkBeginCommandBuffer(cb, &cbbi);
21588 ASSERT_VK_SUCCESS(err);
21589 err = vkEndCommandBuffer(cb);
21590 ASSERT_VK_SUCCESS(err);
21591
21592 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021593 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021594 VkSemaphore s;
21595 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21596 ASSERT_VK_SUCCESS(err);
21597
21598 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021599 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021600
21601 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21602 ASSERT_VK_SUCCESS(err);
21603
21604 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021605 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021606 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021607
21608 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21609 ASSERT_VK_SUCCESS(err);
21610
21611 // Wait for q0 idle
21612 err = vkQueueWaitIdle(q0);
21613 ASSERT_VK_SUCCESS(err);
21614
21615 // Command buffer should have been completed (it was on q0); reset the pool.
21616 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21617
21618 m_errorMonitor->VerifyNotFound();
21619
21620 // Force device completely idle and clean up resources
21621 vkDeviceWaitIdle(m_device->device());
21622 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21623 vkDestroySemaphore(m_device->device(), s, nullptr);
21624}
21625
21626// This is a positive test. No errors should be generated.
21627TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021628 TEST_DESCRIPTION(
21629 "Two command buffers, each in a separate QueueSubmit call "
21630 "submitted on separate queues, the second having a fence, "
21631 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021632
Tony Barbour1fa09702017-03-16 12:09:08 -060021633 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021634 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021635
21636 m_errorMonitor->ExpectSuccess();
21637
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021638 VkFence fence;
21639 VkFenceCreateInfo fence_create_info{};
21640 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21641 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21642
21643 VkSemaphore semaphore;
21644 VkSemaphoreCreateInfo semaphore_create_info{};
21645 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21646 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21647
21648 VkCommandPool command_pool;
21649 VkCommandPoolCreateInfo pool_create_info{};
21650 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21651 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21652 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21653 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21654
21655 VkCommandBuffer command_buffer[2];
21656 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21657 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21658 command_buffer_allocate_info.commandPool = command_pool;
21659 command_buffer_allocate_info.commandBufferCount = 2;
21660 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21661 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21662
21663 VkQueue queue = VK_NULL_HANDLE;
21664 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21665
21666 {
21667 VkCommandBufferBeginInfo begin_info{};
21668 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21669 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21670
21671 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 -070021672 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021673
21674 VkViewport viewport{};
21675 viewport.maxDepth = 1.0f;
21676 viewport.minDepth = 0.0f;
21677 viewport.width = 512;
21678 viewport.height = 512;
21679 viewport.x = 0;
21680 viewport.y = 0;
21681 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21682 vkEndCommandBuffer(command_buffer[0]);
21683 }
21684 {
21685 VkCommandBufferBeginInfo begin_info{};
21686 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21687 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21688
21689 VkViewport viewport{};
21690 viewport.maxDepth = 1.0f;
21691 viewport.minDepth = 0.0f;
21692 viewport.width = 512;
21693 viewport.height = 512;
21694 viewport.x = 0;
21695 viewport.y = 0;
21696 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21697 vkEndCommandBuffer(command_buffer[1]);
21698 }
21699 {
21700 VkSubmitInfo submit_info{};
21701 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21702 submit_info.commandBufferCount = 1;
21703 submit_info.pCommandBuffers = &command_buffer[0];
21704 submit_info.signalSemaphoreCount = 1;
21705 submit_info.pSignalSemaphores = &semaphore;
21706 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21707 }
21708 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021709 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021710 VkSubmitInfo submit_info{};
21711 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21712 submit_info.commandBufferCount = 1;
21713 submit_info.pCommandBuffers = &command_buffer[1];
21714 submit_info.waitSemaphoreCount = 1;
21715 submit_info.pWaitSemaphores = &semaphore;
21716 submit_info.pWaitDstStageMask = flags;
21717 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21718 }
21719
21720 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21721
21722 vkDestroyFence(m_device->device(), fence, nullptr);
21723 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21724 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21725 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21726
21727 m_errorMonitor->VerifyNotFound();
21728}
21729
21730// This is a positive test. No errors should be generated.
21731TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021732 TEST_DESCRIPTION(
21733 "Two command buffers, each in a separate QueueSubmit call "
21734 "on the same queue, sharing a signal/wait semaphore, the "
21735 "second having a fence, "
21736 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021737
21738 m_errorMonitor->ExpectSuccess();
21739
Tony Barbour1fa09702017-03-16 12:09:08 -060021740 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021741 VkFence fence;
21742 VkFenceCreateInfo fence_create_info{};
21743 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21744 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21745
21746 VkSemaphore semaphore;
21747 VkSemaphoreCreateInfo semaphore_create_info{};
21748 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21749 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21750
21751 VkCommandPool command_pool;
21752 VkCommandPoolCreateInfo pool_create_info{};
21753 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21754 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21755 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21756 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21757
21758 VkCommandBuffer command_buffer[2];
21759 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21760 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21761 command_buffer_allocate_info.commandPool = command_pool;
21762 command_buffer_allocate_info.commandBufferCount = 2;
21763 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21764 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21765
21766 {
21767 VkCommandBufferBeginInfo begin_info{};
21768 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21769 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21770
21771 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 -070021772 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021773
21774 VkViewport viewport{};
21775 viewport.maxDepth = 1.0f;
21776 viewport.minDepth = 0.0f;
21777 viewport.width = 512;
21778 viewport.height = 512;
21779 viewport.x = 0;
21780 viewport.y = 0;
21781 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21782 vkEndCommandBuffer(command_buffer[0]);
21783 }
21784 {
21785 VkCommandBufferBeginInfo begin_info{};
21786 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21787 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21788
21789 VkViewport viewport{};
21790 viewport.maxDepth = 1.0f;
21791 viewport.minDepth = 0.0f;
21792 viewport.width = 512;
21793 viewport.height = 512;
21794 viewport.x = 0;
21795 viewport.y = 0;
21796 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21797 vkEndCommandBuffer(command_buffer[1]);
21798 }
21799 {
21800 VkSubmitInfo submit_info{};
21801 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21802 submit_info.commandBufferCount = 1;
21803 submit_info.pCommandBuffers = &command_buffer[0];
21804 submit_info.signalSemaphoreCount = 1;
21805 submit_info.pSignalSemaphores = &semaphore;
21806 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21807 }
21808 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021809 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021810 VkSubmitInfo submit_info{};
21811 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21812 submit_info.commandBufferCount = 1;
21813 submit_info.pCommandBuffers = &command_buffer[1];
21814 submit_info.waitSemaphoreCount = 1;
21815 submit_info.pWaitSemaphores = &semaphore;
21816 submit_info.pWaitDstStageMask = flags;
21817 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21818 }
21819
21820 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21821
21822 vkDestroyFence(m_device->device(), fence, nullptr);
21823 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21824 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21825 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21826
21827 m_errorMonitor->VerifyNotFound();
21828}
21829
21830// This is a positive test. No errors should be generated.
21831TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021832 TEST_DESCRIPTION(
21833 "Two command buffers, each in a separate QueueSubmit call "
21834 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21835 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021836
21837 m_errorMonitor->ExpectSuccess();
21838
Tony Barbour1fa09702017-03-16 12:09:08 -060021839 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021840 VkFence fence;
21841 VkFenceCreateInfo fence_create_info{};
21842 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21843 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21844
21845 VkCommandPool command_pool;
21846 VkCommandPoolCreateInfo pool_create_info{};
21847 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21848 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21849 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21850 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21851
21852 VkCommandBuffer command_buffer[2];
21853 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21854 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21855 command_buffer_allocate_info.commandPool = command_pool;
21856 command_buffer_allocate_info.commandBufferCount = 2;
21857 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21858 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21859
21860 {
21861 VkCommandBufferBeginInfo begin_info{};
21862 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21863 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21864
21865 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 -070021866 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021867
21868 VkViewport viewport{};
21869 viewport.maxDepth = 1.0f;
21870 viewport.minDepth = 0.0f;
21871 viewport.width = 512;
21872 viewport.height = 512;
21873 viewport.x = 0;
21874 viewport.y = 0;
21875 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21876 vkEndCommandBuffer(command_buffer[0]);
21877 }
21878 {
21879 VkCommandBufferBeginInfo begin_info{};
21880 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21881 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21882
21883 VkViewport viewport{};
21884 viewport.maxDepth = 1.0f;
21885 viewport.minDepth = 0.0f;
21886 viewport.width = 512;
21887 viewport.height = 512;
21888 viewport.x = 0;
21889 viewport.y = 0;
21890 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21891 vkEndCommandBuffer(command_buffer[1]);
21892 }
21893 {
21894 VkSubmitInfo submit_info{};
21895 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21896 submit_info.commandBufferCount = 1;
21897 submit_info.pCommandBuffers = &command_buffer[0];
21898 submit_info.signalSemaphoreCount = 0;
21899 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21900 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21901 }
21902 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021903 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021904 VkSubmitInfo submit_info{};
21905 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21906 submit_info.commandBufferCount = 1;
21907 submit_info.pCommandBuffers = &command_buffer[1];
21908 submit_info.waitSemaphoreCount = 0;
21909 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21910 submit_info.pWaitDstStageMask = flags;
21911 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21912 }
21913
21914 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21915
21916 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21917 ASSERT_VK_SUCCESS(err);
21918
21919 vkDestroyFence(m_device->device(), fence, nullptr);
21920 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21921 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21922
21923 m_errorMonitor->VerifyNotFound();
21924}
21925
21926// This is a positive test. No errors should be generated.
21927TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021928 TEST_DESCRIPTION(
21929 "Two command buffers, each in a separate QueueSubmit call "
21930 "on the same queue, the second having a fence, followed "
21931 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021932
21933 m_errorMonitor->ExpectSuccess();
21934
Tony Barbour1fa09702017-03-16 12:09:08 -060021935 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021936 VkFence fence;
21937 VkFenceCreateInfo fence_create_info{};
21938 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21939 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21940
21941 VkCommandPool command_pool;
21942 VkCommandPoolCreateInfo pool_create_info{};
21943 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21944 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21945 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21946 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21947
21948 VkCommandBuffer command_buffer[2];
21949 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21950 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21951 command_buffer_allocate_info.commandPool = command_pool;
21952 command_buffer_allocate_info.commandBufferCount = 2;
21953 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21954 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21955
21956 {
21957 VkCommandBufferBeginInfo begin_info{};
21958 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21959 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21960
21961 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 -070021962 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021963
21964 VkViewport viewport{};
21965 viewport.maxDepth = 1.0f;
21966 viewport.minDepth = 0.0f;
21967 viewport.width = 512;
21968 viewport.height = 512;
21969 viewport.x = 0;
21970 viewport.y = 0;
21971 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21972 vkEndCommandBuffer(command_buffer[0]);
21973 }
21974 {
21975 VkCommandBufferBeginInfo begin_info{};
21976 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21977 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21978
21979 VkViewport viewport{};
21980 viewport.maxDepth = 1.0f;
21981 viewport.minDepth = 0.0f;
21982 viewport.width = 512;
21983 viewport.height = 512;
21984 viewport.x = 0;
21985 viewport.y = 0;
21986 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21987 vkEndCommandBuffer(command_buffer[1]);
21988 }
21989 {
21990 VkSubmitInfo submit_info{};
21991 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21992 submit_info.commandBufferCount = 1;
21993 submit_info.pCommandBuffers = &command_buffer[0];
21994 submit_info.signalSemaphoreCount = 0;
21995 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21996 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21997 }
21998 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021999 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022000 VkSubmitInfo submit_info{};
22001 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22002 submit_info.commandBufferCount = 1;
22003 submit_info.pCommandBuffers = &command_buffer[1];
22004 submit_info.waitSemaphoreCount = 0;
22005 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22006 submit_info.pWaitDstStageMask = flags;
22007 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22008 }
22009
22010 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22011
22012 vkDestroyFence(m_device->device(), fence, nullptr);
22013 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22014 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22015
22016 m_errorMonitor->VerifyNotFound();
22017}
22018
22019// This is a positive test. No errors should be generated.
22020TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022021 TEST_DESCRIPTION(
22022 "Two command buffers each in a separate SubmitInfo sent in a single "
22023 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022024 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022025
22026 m_errorMonitor->ExpectSuccess();
22027
22028 VkFence fence;
22029 VkFenceCreateInfo fence_create_info{};
22030 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22031 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22032
22033 VkSemaphore semaphore;
22034 VkSemaphoreCreateInfo semaphore_create_info{};
22035 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22036 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22037
22038 VkCommandPool command_pool;
22039 VkCommandPoolCreateInfo pool_create_info{};
22040 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22041 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22042 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22043 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22044
22045 VkCommandBuffer command_buffer[2];
22046 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22047 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22048 command_buffer_allocate_info.commandPool = command_pool;
22049 command_buffer_allocate_info.commandBufferCount = 2;
22050 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22051 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22052
22053 {
22054 VkCommandBufferBeginInfo begin_info{};
22055 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22056 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22057
22058 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 -070022059 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022060
22061 VkViewport viewport{};
22062 viewport.maxDepth = 1.0f;
22063 viewport.minDepth = 0.0f;
22064 viewport.width = 512;
22065 viewport.height = 512;
22066 viewport.x = 0;
22067 viewport.y = 0;
22068 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22069 vkEndCommandBuffer(command_buffer[0]);
22070 }
22071 {
22072 VkCommandBufferBeginInfo begin_info{};
22073 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22074 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22075
22076 VkViewport viewport{};
22077 viewport.maxDepth = 1.0f;
22078 viewport.minDepth = 0.0f;
22079 viewport.width = 512;
22080 viewport.height = 512;
22081 viewport.x = 0;
22082 viewport.y = 0;
22083 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22084 vkEndCommandBuffer(command_buffer[1]);
22085 }
22086 {
22087 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022088 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022089
22090 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22091 submit_info[0].pNext = NULL;
22092 submit_info[0].commandBufferCount = 1;
22093 submit_info[0].pCommandBuffers = &command_buffer[0];
22094 submit_info[0].signalSemaphoreCount = 1;
22095 submit_info[0].pSignalSemaphores = &semaphore;
22096 submit_info[0].waitSemaphoreCount = 0;
22097 submit_info[0].pWaitSemaphores = NULL;
22098 submit_info[0].pWaitDstStageMask = 0;
22099
22100 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22101 submit_info[1].pNext = NULL;
22102 submit_info[1].commandBufferCount = 1;
22103 submit_info[1].pCommandBuffers = &command_buffer[1];
22104 submit_info[1].waitSemaphoreCount = 1;
22105 submit_info[1].pWaitSemaphores = &semaphore;
22106 submit_info[1].pWaitDstStageMask = flags;
22107 submit_info[1].signalSemaphoreCount = 0;
22108 submit_info[1].pSignalSemaphores = NULL;
22109 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
22110 }
22111
22112 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22113
22114 vkDestroyFence(m_device->device(), fence, nullptr);
22115 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22116 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22117 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22118
22119 m_errorMonitor->VerifyNotFound();
22120}
22121
22122TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
22123 m_errorMonitor->ExpectSuccess();
22124
Tony Barbour1fa09702017-03-16 12:09:08 -060022125 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022126 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22127
Tony Barbour552f6c02016-12-21 14:34:07 -070022128 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022129
22130 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
22131 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22132 m_errorMonitor->VerifyNotFound();
22133 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
22134 m_errorMonitor->VerifyNotFound();
22135 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22136 m_errorMonitor->VerifyNotFound();
22137
22138 m_commandBuffer->EndCommandBuffer();
22139 m_errorMonitor->VerifyNotFound();
22140}
22141
22142TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022143 TEST_DESCRIPTION(
22144 "Positive test where we create a renderpass with an "
22145 "attachment that uses LOAD_OP_CLEAR, the first subpass "
22146 "has a valid layout, and a second subpass then uses a "
22147 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022148 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060022149 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022150 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022151 if (!depth_format) {
22152 printf(" No Depth + Stencil format found. Skipped.\n");
22153 return;
22154 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022155
22156 VkAttachmentReference attach[2] = {};
22157 attach[0].attachment = 0;
22158 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22159 attach[1].attachment = 0;
22160 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22161 VkSubpassDescription subpasses[2] = {};
22162 // First subpass clears DS attach on load
22163 subpasses[0].pDepthStencilAttachment = &attach[0];
22164 // 2nd subpass reads in DS as input attachment
22165 subpasses[1].inputAttachmentCount = 1;
22166 subpasses[1].pInputAttachments = &attach[1];
22167 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070022168 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022169 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
22170 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
22171 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
22172 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22173 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22174 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22175 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22176 VkRenderPassCreateInfo rpci = {};
22177 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
22178 rpci.attachmentCount = 1;
22179 rpci.pAttachments = &attach_desc;
22180 rpci.subpassCount = 2;
22181 rpci.pSubpasses = subpasses;
22182
22183 // Now create RenderPass and verify no errors
22184 VkRenderPass rp;
22185 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
22186 m_errorMonitor->VerifyNotFound();
22187
22188 vkDestroyRenderPass(m_device->device(), rp, NULL);
22189}
22190
Tobin Ehlis01103de2017-02-16 13:22:47 -070022191TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
22192 TEST_DESCRIPTION(
22193 "Create a render pass with depth-stencil attachment where layout transition "
22194 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
22195 "transition has correctly occurred at queue submit time with no validation errors.");
22196
Tony Barbour1fa09702017-03-16 12:09:08 -060022197 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022198 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022199 if (!depth_format) {
22200 printf(" No Depth + Stencil format found. Skipped.\n");
22201 return;
22202 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070022203 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070022204 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022205 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
22206 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070022207 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070022208 return;
22209 }
22210
22211 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070022212 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22213
22214 // A renderpass with one depth/stencil attachment.
22215 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070022216 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022217 VK_SAMPLE_COUNT_1_BIT,
22218 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22219 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22220 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22221 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22222 VK_IMAGE_LAYOUT_UNDEFINED,
22223 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22224
22225 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22226
22227 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
22228
22229 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
22230
22231 VkRenderPass rp;
22232 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22233 ASSERT_VK_SUCCESS(err);
22234 // A compatible ds image.
22235 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022236 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 -070022237 ASSERT_TRUE(image.initialized());
22238
22239 VkImageViewCreateInfo ivci = {
22240 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22241 nullptr,
22242 0,
22243 image.handle(),
22244 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022245 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022246 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22247 VK_COMPONENT_SWIZZLE_IDENTITY},
22248 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22249 };
22250 VkImageView view;
22251 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22252 ASSERT_VK_SUCCESS(err);
22253
22254 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22255 VkFramebuffer fb;
22256 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22257 ASSERT_VK_SUCCESS(err);
22258
22259 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22260 m_commandBuffer->BeginCommandBuffer();
22261 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22262 vkCmdEndRenderPass(m_commandBuffer->handle());
22263 m_commandBuffer->EndCommandBuffer();
22264 QueueCommandBuffer(false);
22265 m_errorMonitor->VerifyNotFound();
22266
22267 // Cleanup
22268 vkDestroyImageView(m_device->device(), view, NULL);
22269 vkDestroyRenderPass(m_device->device(), rp, NULL);
22270 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22271}
22272
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022273TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022274 TEST_DESCRIPTION(
22275 "Test that pipeline validation accepts matrices passed "
22276 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022277 m_errorMonitor->ExpectSuccess();
22278
Tony Barbour1fa09702017-03-16 12:09:08 -060022279 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022280 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22281
22282 VkVertexInputBindingDescription input_binding;
22283 memset(&input_binding, 0, sizeof(input_binding));
22284
22285 VkVertexInputAttributeDescription input_attribs[2];
22286 memset(input_attribs, 0, sizeof(input_attribs));
22287
22288 for (int i = 0; i < 2; i++) {
22289 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22290 input_attribs[i].location = i;
22291 }
22292
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022293 char const *vsSource =
22294 "#version 450\n"
22295 "\n"
22296 "layout(location=0) in mat2x4 x;\n"
22297 "out gl_PerVertex {\n"
22298 " vec4 gl_Position;\n"
22299 "};\n"
22300 "void main(){\n"
22301 " gl_Position = x[0] + x[1];\n"
22302 "}\n";
22303 char const *fsSource =
22304 "#version 450\n"
22305 "\n"
22306 "layout(location=0) out vec4 color;\n"
22307 "void main(){\n"
22308 " color = vec4(1);\n"
22309 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022310
22311 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22312 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22313
22314 VkPipelineObj pipe(m_device);
22315 pipe.AddColorAttachment();
22316 pipe.AddShader(&vs);
22317 pipe.AddShader(&fs);
22318
22319 pipe.AddVertexInputBindings(&input_binding, 1);
22320 pipe.AddVertexInputAttribs(input_attribs, 2);
22321
22322 VkDescriptorSetObj descriptorSet(m_device);
22323 descriptorSet.AppendDummy();
22324 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22325
22326 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22327
22328 /* expect success */
22329 m_errorMonitor->VerifyNotFound();
22330}
22331
22332TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22333 m_errorMonitor->ExpectSuccess();
22334
Tony Barbour1fa09702017-03-16 12:09:08 -060022335 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22337
22338 VkVertexInputBindingDescription input_binding;
22339 memset(&input_binding, 0, sizeof(input_binding));
22340
22341 VkVertexInputAttributeDescription input_attribs[2];
22342 memset(input_attribs, 0, sizeof(input_attribs));
22343
22344 for (int i = 0; i < 2; i++) {
22345 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22346 input_attribs[i].location = i;
22347 }
22348
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022349 char const *vsSource =
22350 "#version 450\n"
22351 "\n"
22352 "layout(location=0) in vec4 x[2];\n"
22353 "out gl_PerVertex {\n"
22354 " vec4 gl_Position;\n"
22355 "};\n"
22356 "void main(){\n"
22357 " gl_Position = x[0] + x[1];\n"
22358 "}\n";
22359 char const *fsSource =
22360 "#version 450\n"
22361 "\n"
22362 "layout(location=0) out vec4 color;\n"
22363 "void main(){\n"
22364 " color = vec4(1);\n"
22365 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022366
22367 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22368 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22369
22370 VkPipelineObj pipe(m_device);
22371 pipe.AddColorAttachment();
22372 pipe.AddShader(&vs);
22373 pipe.AddShader(&fs);
22374
22375 pipe.AddVertexInputBindings(&input_binding, 1);
22376 pipe.AddVertexInputAttribs(input_attribs, 2);
22377
22378 VkDescriptorSetObj descriptorSet(m_device);
22379 descriptorSet.AppendDummy();
22380 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22381
22382 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22383
22384 m_errorMonitor->VerifyNotFound();
22385}
22386
22387TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022388 TEST_DESCRIPTION(
22389 "Test that pipeline validation accepts consuming a vertex attribute "
22390 "through multiple vertex shader inputs, each consuming a different "
22391 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022392 m_errorMonitor->ExpectSuccess();
22393
Tony Barbour1fa09702017-03-16 12:09:08 -060022394 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22396
22397 VkVertexInputBindingDescription input_binding;
22398 memset(&input_binding, 0, sizeof(input_binding));
22399
22400 VkVertexInputAttributeDescription input_attribs[3];
22401 memset(input_attribs, 0, sizeof(input_attribs));
22402
22403 for (int i = 0; i < 3; i++) {
22404 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22405 input_attribs[i].location = i;
22406 }
22407
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022408 char const *vsSource =
22409 "#version 450\n"
22410 "\n"
22411 "layout(location=0) in vec4 x;\n"
22412 "layout(location=1) in vec3 y1;\n"
22413 "layout(location=1, component=3) in float y2;\n"
22414 "layout(location=2) in vec4 z;\n"
22415 "out gl_PerVertex {\n"
22416 " vec4 gl_Position;\n"
22417 "};\n"
22418 "void main(){\n"
22419 " gl_Position = x + vec4(y1, y2) + z;\n"
22420 "}\n";
22421 char const *fsSource =
22422 "#version 450\n"
22423 "\n"
22424 "layout(location=0) out vec4 color;\n"
22425 "void main(){\n"
22426 " color = vec4(1);\n"
22427 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022428
22429 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22430 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22431
22432 VkPipelineObj pipe(m_device);
22433 pipe.AddColorAttachment();
22434 pipe.AddShader(&vs);
22435 pipe.AddShader(&fs);
22436
22437 pipe.AddVertexInputBindings(&input_binding, 1);
22438 pipe.AddVertexInputAttribs(input_attribs, 3);
22439
22440 VkDescriptorSetObj descriptorSet(m_device);
22441 descriptorSet.AppendDummy();
22442 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22443
22444 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22445
22446 m_errorMonitor->VerifyNotFound();
22447}
22448
22449TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22450 m_errorMonitor->ExpectSuccess();
22451
Tony Barbour1fa09702017-03-16 12:09:08 -060022452 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22454
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022455 char const *vsSource =
22456 "#version 450\n"
22457 "out gl_PerVertex {\n"
22458 " vec4 gl_Position;\n"
22459 "};\n"
22460 "void main(){\n"
22461 " gl_Position = vec4(0);\n"
22462 "}\n";
22463 char const *fsSource =
22464 "#version 450\n"
22465 "\n"
22466 "layout(location=0) out vec4 color;\n"
22467 "void main(){\n"
22468 " color = vec4(1);\n"
22469 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022470
22471 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22472 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22473
22474 VkPipelineObj pipe(m_device);
22475 pipe.AddColorAttachment();
22476 pipe.AddShader(&vs);
22477 pipe.AddShader(&fs);
22478
22479 VkDescriptorSetObj descriptorSet(m_device);
22480 descriptorSet.AppendDummy();
22481 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22482
22483 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22484
22485 m_errorMonitor->VerifyNotFound();
22486}
22487
22488TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022489 TEST_DESCRIPTION(
22490 "Test that pipeline validation accepts the relaxed type matching rules "
22491 "set out in 14.1.3: fundamental type must match, and producer side must "
22492 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022493 m_errorMonitor->ExpectSuccess();
22494
22495 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22496
Tony Barbour1fa09702017-03-16 12:09:08 -060022497 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022498 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22499
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022500 char const *vsSource =
22501 "#version 450\n"
22502 "out gl_PerVertex {\n"
22503 " vec4 gl_Position;\n"
22504 "};\n"
22505 "layout(location=0) out vec3 x;\n"
22506 "layout(location=1) out ivec3 y;\n"
22507 "layout(location=2) out vec3 z;\n"
22508 "void main(){\n"
22509 " gl_Position = vec4(0);\n"
22510 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22511 "}\n";
22512 char const *fsSource =
22513 "#version 450\n"
22514 "\n"
22515 "layout(location=0) out vec4 color;\n"
22516 "layout(location=0) in float x;\n"
22517 "layout(location=1) flat in int y;\n"
22518 "layout(location=2) in vec2 z;\n"
22519 "void main(){\n"
22520 " color = vec4(1 + x + y + z.x);\n"
22521 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022522
22523 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22524 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22525
22526 VkPipelineObj pipe(m_device);
22527 pipe.AddColorAttachment();
22528 pipe.AddShader(&vs);
22529 pipe.AddShader(&fs);
22530
22531 VkDescriptorSetObj descriptorSet(m_device);
22532 descriptorSet.AppendDummy();
22533 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22534
22535 VkResult err = VK_SUCCESS;
22536 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22537 ASSERT_VK_SUCCESS(err);
22538
22539 m_errorMonitor->VerifyNotFound();
22540}
22541
22542TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022543 TEST_DESCRIPTION(
22544 "Test that pipeline validation accepts per-vertex variables "
22545 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022546 m_errorMonitor->ExpectSuccess();
22547
Tony Barbour1fa09702017-03-16 12:09:08 -060022548 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022549 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22550
22551 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022552 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022553 return;
22554 }
22555
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022556 char const *vsSource =
22557 "#version 450\n"
22558 "void main(){}\n";
22559 char const *tcsSource =
22560 "#version 450\n"
22561 "layout(location=0) out int x[];\n"
22562 "layout(vertices=3) out;\n"
22563 "void main(){\n"
22564 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22565 " gl_TessLevelInner[0] = 1;\n"
22566 " x[gl_InvocationID] = gl_InvocationID;\n"
22567 "}\n";
22568 char const *tesSource =
22569 "#version 450\n"
22570 "layout(triangles, equal_spacing, cw) in;\n"
22571 "layout(location=0) in int x[];\n"
22572 "out gl_PerVertex { vec4 gl_Position; };\n"
22573 "void main(){\n"
22574 " gl_Position.xyz = gl_TessCoord;\n"
22575 " gl_Position.w = x[0] + x[1] + x[2];\n"
22576 "}\n";
22577 char const *fsSource =
22578 "#version 450\n"
22579 "layout(location=0) out vec4 color;\n"
22580 "void main(){\n"
22581 " color = vec4(1);\n"
22582 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022583
22584 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22585 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22586 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22587 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22588
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022589 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22590 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022591
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022592 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022593
22594 VkPipelineObj pipe(m_device);
22595 pipe.SetInputAssembly(&iasci);
22596 pipe.SetTessellation(&tsci);
22597 pipe.AddColorAttachment();
22598 pipe.AddShader(&vs);
22599 pipe.AddShader(&tcs);
22600 pipe.AddShader(&tes);
22601 pipe.AddShader(&fs);
22602
22603 VkDescriptorSetObj descriptorSet(m_device);
22604 descriptorSet.AppendDummy();
22605 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22606
22607 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22608
22609 m_errorMonitor->VerifyNotFound();
22610}
22611
22612TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022613 TEST_DESCRIPTION(
22614 "Test that pipeline validation accepts a user-defined "
22615 "interface block passed into the geometry shader. This "
22616 "is interesting because the 'extra' array level is not "
22617 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022618 m_errorMonitor->ExpectSuccess();
22619
Tony Barbour1fa09702017-03-16 12:09:08 -060022620 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22622
22623 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022624 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022625 return;
22626 }
22627
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022628 char const *vsSource =
22629 "#version 450\n"
22630 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22631 "void main(){\n"
22632 " vs_out.x = vec4(1);\n"
22633 "}\n";
22634 char const *gsSource =
22635 "#version 450\n"
22636 "layout(triangles) in;\n"
22637 "layout(triangle_strip, max_vertices=3) out;\n"
22638 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22639 "out gl_PerVertex { vec4 gl_Position; };\n"
22640 "void main() {\n"
22641 " gl_Position = gs_in[0].x;\n"
22642 " EmitVertex();\n"
22643 "}\n";
22644 char const *fsSource =
22645 "#version 450\n"
22646 "layout(location=0) out vec4 color;\n"
22647 "void main(){\n"
22648 " color = vec4(1);\n"
22649 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022650
22651 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22652 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22653 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22654
22655 VkPipelineObj pipe(m_device);
22656 pipe.AddColorAttachment();
22657 pipe.AddShader(&vs);
22658 pipe.AddShader(&gs);
22659 pipe.AddShader(&fs);
22660
22661 VkDescriptorSetObj descriptorSet(m_device);
22662 descriptorSet.AppendDummy();
22663 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22664
22665 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22666
22667 m_errorMonitor->VerifyNotFound();
22668}
22669
22670TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022671 TEST_DESCRIPTION(
22672 "Test that pipeline validation accepts basic use of 64bit vertex "
22673 "attributes. This is interesting because they consume multiple "
22674 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022675 m_errorMonitor->ExpectSuccess();
22676
Tony Barbour1fa09702017-03-16 12:09:08 -060022677 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022678 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22679
22680 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022681 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022682 return;
22683 }
22684
22685 VkVertexInputBindingDescription input_bindings[1];
22686 memset(input_bindings, 0, sizeof(input_bindings));
22687
22688 VkVertexInputAttributeDescription input_attribs[4];
22689 memset(input_attribs, 0, sizeof(input_attribs));
22690 input_attribs[0].location = 0;
22691 input_attribs[0].offset = 0;
22692 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22693 input_attribs[1].location = 2;
22694 input_attribs[1].offset = 32;
22695 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22696 input_attribs[2].location = 4;
22697 input_attribs[2].offset = 64;
22698 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22699 input_attribs[3].location = 6;
22700 input_attribs[3].offset = 96;
22701 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22702
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022703 char const *vsSource =
22704 "#version 450\n"
22705 "\n"
22706 "layout(location=0) in dmat4 x;\n"
22707 "out gl_PerVertex {\n"
22708 " vec4 gl_Position;\n"
22709 "};\n"
22710 "void main(){\n"
22711 " gl_Position = vec4(x[0][0]);\n"
22712 "}\n";
22713 char const *fsSource =
22714 "#version 450\n"
22715 "\n"
22716 "layout(location=0) out vec4 color;\n"
22717 "void main(){\n"
22718 " color = vec4(1);\n"
22719 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022720
22721 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22722 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22723
22724 VkPipelineObj pipe(m_device);
22725 pipe.AddColorAttachment();
22726 pipe.AddShader(&vs);
22727 pipe.AddShader(&fs);
22728
22729 pipe.AddVertexInputBindings(input_bindings, 1);
22730 pipe.AddVertexInputAttribs(input_attribs, 4);
22731
22732 VkDescriptorSetObj descriptorSet(m_device);
22733 descriptorSet.AppendDummy();
22734 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22735
22736 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22737
22738 m_errorMonitor->VerifyNotFound();
22739}
22740
22741TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22742 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22743 m_errorMonitor->ExpectSuccess();
22744
Tony Barbour1fa09702017-03-16 12:09:08 -060022745 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022746
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022747 char const *vsSource =
22748 "#version 450\n"
22749 "\n"
22750 "out gl_PerVertex {\n"
22751 " vec4 gl_Position;\n"
22752 "};\n"
22753 "void main(){\n"
22754 " gl_Position = vec4(1);\n"
22755 "}\n";
22756 char const *fsSource =
22757 "#version 450\n"
22758 "\n"
22759 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22760 "layout(location=0) out vec4 color;\n"
22761 "void main() {\n"
22762 " color = subpassLoad(x);\n"
22763 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022764
22765 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22766 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22767
22768 VkPipelineObj pipe(m_device);
22769 pipe.AddShader(&vs);
22770 pipe.AddShader(&fs);
22771 pipe.AddColorAttachment();
22772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22773
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022774 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22775 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022776 VkDescriptorSetLayout dsl;
22777 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22778 ASSERT_VK_SUCCESS(err);
22779
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022780 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022781 VkPipelineLayout pl;
22782 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22783 ASSERT_VK_SUCCESS(err);
22784
22785 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022786 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22787 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22788 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22789 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22790 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 -060022791 };
22792 VkAttachmentReference color = {
22793 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22794 };
22795 VkAttachmentReference input = {
22796 1, VK_IMAGE_LAYOUT_GENERAL,
22797 };
22798
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022799 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022800
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022801 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022802 VkRenderPass rp;
22803 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22804 ASSERT_VK_SUCCESS(err);
22805
22806 // should be OK. would go wrong here if it's going to...
22807 pipe.CreateVKPipeline(pl, rp);
22808
22809 m_errorMonitor->VerifyNotFound();
22810
22811 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22812 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22813 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22814}
22815
22816TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022817 TEST_DESCRIPTION(
22818 "Test that pipeline validation accepts a compute pipeline which declares a "
22819 "descriptor-backed resource which is not provided, but the shader does not "
22820 "statically use it. This is interesting because it requires compute pipelines "
22821 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022822 m_errorMonitor->ExpectSuccess();
22823
Tony Barbour1fa09702017-03-16 12:09:08 -060022824 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022825
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022826 char const *csSource =
22827 "#version 450\n"
22828 "\n"
22829 "layout(local_size_x=1) in;\n"
22830 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22831 "void main(){\n"
22832 " // x is not used.\n"
22833 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022834
22835 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22836
22837 VkDescriptorSetObj descriptorSet(m_device);
22838 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22839
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022840 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22841 nullptr,
22842 0,
22843 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22844 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22845 descriptorSet.GetPipelineLayout(),
22846 VK_NULL_HANDLE,
22847 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022848
22849 VkPipeline pipe;
22850 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22851
22852 m_errorMonitor->VerifyNotFound();
22853
22854 if (err == VK_SUCCESS) {
22855 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22856 }
22857}
22858
22859TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022860 TEST_DESCRIPTION(
22861 "Test that pipeline validation accepts a shader consuming only the "
22862 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022863 m_errorMonitor->ExpectSuccess();
22864
Tony Barbour1fa09702017-03-16 12:09:08 -060022865 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022866
22867 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022868 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22869 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22870 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022871 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022872 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022873 VkDescriptorSetLayout dsl;
22874 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22875 ASSERT_VK_SUCCESS(err);
22876
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022877 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022878 VkPipelineLayout pl;
22879 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22880 ASSERT_VK_SUCCESS(err);
22881
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022882 char const *csSource =
22883 "#version 450\n"
22884 "\n"
22885 "layout(local_size_x=1) in;\n"
22886 "layout(set=0, binding=0) uniform sampler s;\n"
22887 "layout(set=0, binding=1) uniform texture2D t;\n"
22888 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22889 "void main() {\n"
22890 " x = texture(sampler2D(t, s), vec2(0));\n"
22891 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022892 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22893
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022894 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22895 nullptr,
22896 0,
22897 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22898 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22899 pl,
22900 VK_NULL_HANDLE,
22901 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022902
22903 VkPipeline pipe;
22904 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22905
22906 m_errorMonitor->VerifyNotFound();
22907
22908 if (err == VK_SUCCESS) {
22909 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22910 }
22911
22912 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22913 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22914}
22915
22916TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022917 TEST_DESCRIPTION(
22918 "Test that pipeline validation accepts a shader consuming only the "
22919 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022920 m_errorMonitor->ExpectSuccess();
22921
Tony Barbour1fa09702017-03-16 12:09:08 -060022922 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022923
22924 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022925 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22926 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22927 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022928 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022929 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022930 VkDescriptorSetLayout dsl;
22931 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22932 ASSERT_VK_SUCCESS(err);
22933
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022934 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022935 VkPipelineLayout pl;
22936 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22937 ASSERT_VK_SUCCESS(err);
22938
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022939 char const *csSource =
22940 "#version 450\n"
22941 "\n"
22942 "layout(local_size_x=1) in;\n"
22943 "layout(set=0, binding=0) uniform texture2D t;\n"
22944 "layout(set=0, binding=1) uniform sampler s;\n"
22945 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22946 "void main() {\n"
22947 " x = texture(sampler2D(t, s), vec2(0));\n"
22948 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022949 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22950
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022951 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22952 nullptr,
22953 0,
22954 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22955 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22956 pl,
22957 VK_NULL_HANDLE,
22958 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022959
22960 VkPipeline pipe;
22961 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22962
22963 m_errorMonitor->VerifyNotFound();
22964
22965 if (err == VK_SUCCESS) {
22966 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22967 }
22968
22969 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22970 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22971}
22972
22973TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022974 TEST_DESCRIPTION(
22975 "Test that pipeline validation accepts a shader consuming "
22976 "both the sampler and the image of a combined image+sampler "
22977 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022978 m_errorMonitor->ExpectSuccess();
22979
Tony Barbour1fa09702017-03-16 12:09:08 -060022980 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022981
22982 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022983 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22984 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022985 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022986 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022987 VkDescriptorSetLayout dsl;
22988 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22989 ASSERT_VK_SUCCESS(err);
22990
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022991 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022992 VkPipelineLayout pl;
22993 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22994 ASSERT_VK_SUCCESS(err);
22995
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022996 char const *csSource =
22997 "#version 450\n"
22998 "\n"
22999 "layout(local_size_x=1) in;\n"
23000 "layout(set=0, binding=0) uniform texture2D t;\n"
23001 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
23002 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
23003 "void main() {\n"
23004 " x = texture(sampler2D(t, s), vec2(0));\n"
23005 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023006 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23007
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023008 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23009 nullptr,
23010 0,
23011 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23012 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23013 pl,
23014 VK_NULL_HANDLE,
23015 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023016
23017 VkPipeline pipe;
23018 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23019
23020 m_errorMonitor->VerifyNotFound();
23021
23022 if (err == VK_SUCCESS) {
23023 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23024 }
23025
23026 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23027 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23028}
23029
Tony Barbour3ed87a02017-03-15 16:19:02 -060023030TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023031 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23032
Tony Barbour3ed87a02017-03-15 16:19:02 -060023033 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023034 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023035
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023036 // Ensure that extension is available and enabled.
23037 uint32_t extension_count = 0;
23038 bool supports_maintenance1_extension = false;
23039 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23040 ASSERT_VK_SUCCESS(err);
23041 if (extension_count > 0) {
23042 std::vector<VkExtensionProperties> available_extensions(extension_count);
23043
23044 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23045 ASSERT_VK_SUCCESS(err);
23046 for (const auto &extension_props : available_extensions) {
23047 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23048 supports_maintenance1_extension = true;
23049 }
23050 }
23051 }
23052
23053 // Proceed if extension is supported by hardware
23054 if (!supports_maintenance1_extension) {
23055 printf(" Maintenance1 Extension not supported, skipping tests\n");
23056 return;
23057 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023058
23059 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023060 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023061 VkCommandBuffer cmd_buf;
23062 VkCommandBufferAllocateInfo alloc_info;
23063 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23064 alloc_info.pNext = NULL;
23065 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023066 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023067 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23068 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23069
23070 VkCommandBufferBeginInfo cb_binfo;
23071 cb_binfo.pNext = NULL;
23072 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23073 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23074 cb_binfo.flags = 0;
23075 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23076 // Set Negative height, should give error if Maintenance 1 is not enabled
23077 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23078 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23079 vkEndCommandBuffer(cmd_buf);
23080
23081 m_errorMonitor->VerifyNotFound();
23082}
23083
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023084TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23085 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23086
23087 ASSERT_NO_FATAL_FAILURE(Init());
23088
23089 uint32_t extension_count = 0;
23090 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23091 ASSERT_VK_SUCCESS(err);
23092
23093 if (extension_count > 0) {
23094 std::vector<VkExtensionProperties> available_extensions(extension_count);
23095 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23096 ASSERT_VK_SUCCESS(err);
23097
23098 for (const auto &extension_props : available_extensions) {
23099 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23100 // Create two pNext structures which by themselves would be valid
23101 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23102 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23103 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23104 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
23105 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23106
23107 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23108 dedicated_buffer_create_info_2.pNext = nullptr;
23109 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
23110
23111 uint32_t queue_family_index = 0;
23112 VkBufferCreateInfo buffer_create_info = {};
23113 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23114 buffer_create_info.pNext = &dedicated_buffer_create_info;
23115 buffer_create_info.size = 1024;
23116 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23117 buffer_create_info.queueFamilyIndexCount = 1;
23118 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23119
23120 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
23121 VkBuffer buffer;
23122 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
23123 m_errorMonitor->VerifyFound();
23124 }
23125 }
23126 }
23127}
23128
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023129TEST_F(VkPositiveLayerTest, ValidStructPNext) {
23130 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
23131
Tony Barbour1fa09702017-03-16 12:09:08 -060023132 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023133
23134 // Positive test to check parameter_validation and unique_objects support
23135 // for NV_dedicated_allocation
23136 uint32_t extension_count = 0;
23137 bool supports_nv_dedicated_allocation = false;
23138 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23139 ASSERT_VK_SUCCESS(err);
23140
23141 if (extension_count > 0) {
23142 std::vector<VkExtensionProperties> available_extensions(extension_count);
23143
23144 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23145 ASSERT_VK_SUCCESS(err);
23146
23147 for (const auto &extension_props : available_extensions) {
23148 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23149 supports_nv_dedicated_allocation = true;
23150 }
23151 }
23152 }
23153
23154 if (supports_nv_dedicated_allocation) {
23155 m_errorMonitor->ExpectSuccess();
23156
23157 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23158 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23159 dedicated_buffer_create_info.pNext = nullptr;
23160 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23161
23162 uint32_t queue_family_index = 0;
23163 VkBufferCreateInfo buffer_create_info = {};
23164 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23165 buffer_create_info.pNext = &dedicated_buffer_create_info;
23166 buffer_create_info.size = 1024;
23167 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23168 buffer_create_info.queueFamilyIndexCount = 1;
23169 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23170
23171 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070023172 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023173 ASSERT_VK_SUCCESS(err);
23174
23175 VkMemoryRequirements memory_reqs;
23176 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
23177
23178 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
23179 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
23180 dedicated_memory_info.pNext = nullptr;
23181 dedicated_memory_info.buffer = buffer;
23182 dedicated_memory_info.image = VK_NULL_HANDLE;
23183
23184 VkMemoryAllocateInfo memory_info = {};
23185 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
23186 memory_info.pNext = &dedicated_memory_info;
23187 memory_info.allocationSize = memory_reqs.size;
23188
23189 bool pass;
23190 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
23191 ASSERT_TRUE(pass);
23192
23193 VkDeviceMemory buffer_memory;
23194 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
23195 ASSERT_VK_SUCCESS(err);
23196
23197 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
23198 ASSERT_VK_SUCCESS(err);
23199
23200 vkDestroyBuffer(m_device->device(), buffer, NULL);
23201 vkFreeMemory(m_device->device(), buffer_memory, NULL);
23202
23203 m_errorMonitor->VerifyNotFound();
23204 }
23205}
23206
23207TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
23208 VkResult err;
23209
23210 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
23211
Tony Barbour1fa09702017-03-16 12:09:08 -060023212 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023213 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23214
23215 std::vector<const char *> device_extension_names;
23216 auto features = m_device->phy().features();
23217 // Artificially disable support for non-solid fill modes
23218 features.fillModeNonSolid = false;
23219 // The sacrificial device object
23220 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
23221
23222 VkRenderpassObj render_pass(&test_device);
23223
23224 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
23225 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
23226 pipeline_layout_ci.setLayoutCount = 0;
23227 pipeline_layout_ci.pSetLayouts = NULL;
23228
23229 VkPipelineLayout pipeline_layout;
23230 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
23231 ASSERT_VK_SUCCESS(err);
23232
23233 VkPipelineRasterizationStateCreateInfo rs_ci = {};
23234 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
23235 rs_ci.pNext = nullptr;
23236 rs_ci.lineWidth = 1.0f;
23237 rs_ci.rasterizerDiscardEnable = true;
23238
23239 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
23240 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23241
23242 // Set polygonMode=FILL. No error is expected
23243 m_errorMonitor->ExpectSuccess();
23244 {
23245 VkPipelineObj pipe(&test_device);
23246 pipe.AddShader(&vs);
23247 pipe.AddShader(&fs);
23248 pipe.AddColorAttachment();
23249 // Set polygonMode to a good value
23250 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23251 pipe.SetRasterization(&rs_ci);
23252 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23253 }
23254 m_errorMonitor->VerifyNotFound();
23255
23256 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23257}
23258
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023259#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023260TEST_F(VkPositiveLayerTest, LongFenceChain)
23261{
23262 m_errorMonitor->ExpectSuccess();
23263
Tony Barbour1fa09702017-03-16 12:09:08 -060023264 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023265 VkResult err;
23266
23267 std::vector<VkFence> fences;
23268
23269 const int chainLength = 32768;
23270
23271 for (int i = 0; i < chainLength; i++) {
23272 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23273 VkFence fence;
23274 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23275 ASSERT_VK_SUCCESS(err);
23276
23277 fences.push_back(fence);
23278
23279 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23280 0, nullptr, 0, nullptr };
23281 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23282 ASSERT_VK_SUCCESS(err);
23283
23284 }
23285
23286 // BOOM, stack overflow.
23287 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23288
23289 for (auto fence : fences)
23290 vkDestroyFence(m_device->device(), fence, nullptr);
23291
23292 m_errorMonitor->VerifyNotFound();
23293}
23294#endif
23295
Cody Northrop1242dfd2016-07-13 17:24:59 -060023296#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060023297const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023298static bool initialized = false;
23299static bool active = false;
23300
23301// Convert Intents to argv
23302// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023303std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023304 std::vector<std::string> args;
23305 JavaVM &vm = *app.activity->vm;
23306 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023307 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023308
23309 JNIEnv &env = *p_env;
23310 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023311 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023312 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023313 jmethodID get_string_extra_method =
23314 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023315 jvalue get_string_extra_args;
23316 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023317 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023318
23319 std::string args_str;
23320 if (extra_str) {
23321 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23322 args_str = extra_utf;
23323 env.ReleaseStringUTFChars(extra_str, extra_utf);
23324 env.DeleteLocalRef(extra_str);
23325 }
23326
23327 env.DeleteLocalRef(get_string_extra_args.l);
23328 env.DeleteLocalRef(intent);
23329 vm.DetachCurrentThread();
23330
23331 // split args_str
23332 std::stringstream ss(args_str);
23333 std::string arg;
23334 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023335 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023336 }
23337
23338 return args;
23339}
23340
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023341void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
23342 const char *const type_param = test_info.type_param();
23343 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060023344
23345 if (type_param != NULL || value_param != NULL) {
23346 error_message.append(", where ");
23347 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023348 error_message.append("TypeParam = ").append(type_param);
23349 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060023350 }
23351 if (value_param != NULL) {
23352 error_message.append("GetParam() = ").append(value_param);
23353 }
23354 }
23355}
23356
23357// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
23358class LogcatPrinter : public ::testing::EmptyTestEventListener {
23359 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023360 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023361 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
23362 }
23363
23364 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023365 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060023366 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023367 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060023368
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023369 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
23370 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060023371 }
23372
23373 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023374 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023375 std::string result;
23376 if (info.result()->Passed()) {
23377 result.append("[ OK ]");
23378 } else {
23379 result.append("[ FAILED ]");
23380 }
23381 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023382 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060023383
23384 if (::testing::GTEST_FLAG(print_time)) {
23385 std::ostringstream os;
23386 os << info.result()->elapsed_time();
23387 result.append(" (").append(os.str()).append(" ms)");
23388 }
23389
23390 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
23391 };
23392};
23393
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023394static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023395
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023396static void processCommand(struct android_app *app, int32_t cmd) {
23397 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023398 case APP_CMD_INIT_WINDOW: {
23399 if (app->window) {
23400 initialized = true;
23401 }
23402 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023403 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023404 case APP_CMD_GAINED_FOCUS: {
23405 active = true;
23406 break;
23407 }
23408 case APP_CMD_LOST_FOCUS: {
23409 active = false;
23410 break;
23411 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023412 }
23413}
23414
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023415void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023416 app_dummy();
23417
Cody Northrop1242dfd2016-07-13 17:24:59 -060023418 int vulkanSupport = InitVulkan();
23419 if (vulkanSupport == 0) {
23420 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23421 return;
23422 }
23423
23424 app->onAppCmd = processCommand;
23425 app->onInputEvent = processInput;
23426
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023427 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023428 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023429 struct android_poll_source *source;
23430 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023431 if (source) {
23432 source->process(app, source);
23433 }
23434
23435 if (app->destroyRequested != 0) {
23436 VkTestFramework::Finish();
23437 return;
23438 }
23439 }
23440
23441 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023442 // Use the following key to send arguments to gtest, i.e.
23443 // --es args "--gtest_filter=-VkLayerTest.foo"
23444 const char key[] = "args";
23445 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023446
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023447 std::string filter = "";
23448 if (args.size() > 0) {
23449 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23450 filter += args[0];
23451 } else {
23452 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23453 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023454
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023455 int argc = 2;
23456 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23457 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023458
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023459 // Route output to files until we can override the gtest output
23460 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23461 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023462
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023463 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060023464
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023465 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060023466 listeners.Append(new LogcatPrinter);
23467
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023468 VkTestFramework::InitArgs(&argc, argv);
23469 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023470
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023471 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023472
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023473 if (result != 0) {
23474 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23475 } else {
23476 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23477 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023478
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023479 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023480
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023481 fclose(stdout);
23482 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023483
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023484 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023485 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023486 }
23487 }
23488}
23489#endif
23490
Tony Barbour300a6082015-04-07 13:44:53 -060023491int main(int argc, char **argv) {
23492 int result;
23493
Cody Northrop8e54a402016-03-08 22:25:52 -070023494#ifdef ANDROID
23495 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023496 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023497#endif
23498
Tony Barbour300a6082015-04-07 13:44:53 -060023499 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023500 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023501
23502 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23503
23504 result = RUN_ALL_TESTS();
23505
Tony Barbour6918cd52015-04-09 12:58:51 -060023506 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023507 return result;
23508}