blob: 41a342db9a3c698ee082baec21a8377e93529909 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Dave Houltonc85c4a82017-04-25 15:56:45 -0600341#ifdef _DEBUG
342 char embedded_code_string[2048];
343 snprintf(embedded_code_string, 2048, "%s [%05d]", pMsg, msgCode);
344 return errMonitor->CheckForDesiredMsg(msgCode, embedded_code_string);
345#else
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600346 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Dave Houltonc85c4a82017-04-25 15:56:45 -0600347#endif
Tony Barbour0b4d9562015-04-09 10:48:04 -0600348 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600349 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600350}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500351
Karl Schultz6addd812016-02-02 17:17:23 -0700352class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700353 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600354 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
355 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700356 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600357 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
358 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700359 }
Tony Barbour300a6082015-04-07 13:44:53 -0600360
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600361 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
362 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700363 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600364 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700365 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600366 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700367 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600368 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
369 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
370 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700371 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
372 }
373 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
374 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
375 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600376 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
378 InitState(features, flags);
379 }
380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700381 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700382 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600384 std::vector<const char *> instance_layer_names;
385 std::vector<const char *> instance_extension_names;
386 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600387
388 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700389 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600390 /*
391 * Since CreateDbgMsgCallback is an instance level extension call
392 * any extension / layer that utilizes that feature also needs
393 * to be enabled at create instance time.
394 */
Karl Schultz6addd812016-02-02 17:17:23 -0700395 // Use Threading layer first to protect others from
396 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700397 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600398 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800399 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700400 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600401 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700402 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600403
Ian Elliott2c1daf52016-05-12 09:41:46 -0600404 if (m_enableWSI) {
405 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
406 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
407#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
408#if defined(VK_USE_PLATFORM_ANDROID_KHR)
409 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_MIR_KHR)
412 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600414#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
415 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700416#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600417#if defined(VK_USE_PLATFORM_WIN32_KHR)
418 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_WIN32_KHR
420#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600421#if defined(VK_USE_PLATFORM_XCB_KHR)
422 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
423#elif defined(VK_USE_PLATFORM_XLIB_KHR)
424 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700425#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600426 }
427
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600428 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600429 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800430 this->app_info.pApplicationName = "layer_tests";
431 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600432 this->app_info.pEngineName = "unittest";
433 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600434 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600435
Tony Barbour15524c32015-04-29 17:34:29 -0600436 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
438
439 virtual void TearDown() {
440 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600441 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600442 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600443 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600444
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600445 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600446};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500447
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600448void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449 // Create identity matrix
450 int i;
451 struct vktriangle_vs_uniform data;
452
453 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700454 glm::mat4 View = glm::mat4(1.0f);
455 glm::mat4 Model = glm::mat4(1.0f);
456 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700458 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
460 memcpy(&data.mvp, &MVP[0][0], matrixSize);
461
Karl Schultz6addd812016-02-02 17:17:23 -0700462 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600463 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500464 };
465
Karl Schultz6addd812016-02-02 17:17:23 -0700466 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 data.position[i][0] = tri_data[i].posX;
468 data.position[i][1] = tri_data[i].posY;
469 data.position[i][2] = tri_data[i].posZ;
470 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700471 data.color[i][0] = tri_data[i].r;
472 data.color[i][1] = tri_data[i].g;
473 data.color[i][2] = tri_data[i].b;
474 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475 }
476
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477 ASSERT_NO_FATAL_FAILURE(InitViewport());
478
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200479 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
480 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Karl Schultz6addd812016-02-02 17:17:23 -0700482 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600483 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484
485 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800486 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500487 pipelineobj.AddShader(&vs);
488 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 if (failMask & BsoFailLineWidth) {
490 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600491 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600492 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
494 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600495 }
496 if (failMask & BsoFailDepthBias) {
497 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600498 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600499 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600500 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600501 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600502 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600503 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700504 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700505 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600506 if (failMask & BsoFailViewport) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
508 }
509 if (failMask & BsoFailScissor) {
510 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
511 }
512 if (failMask & BsoFailBlend) {
513 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600514 VkPipelineColorBlendAttachmentState att_state = {};
515 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
516 att_state.blendEnable = VK_TRUE;
517 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600518 }
519 if (failMask & BsoFailDepthBounds) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
521 }
522 if (failMask & BsoFailStencilReadMask) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
524 }
525 if (failMask & BsoFailStencilWriteMask) {
526 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
527 }
528 if (failMask & BsoFailStencilReference) {
529 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
530 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500531
532 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600533 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700536 m_commandBuffer->BeginCommandBuffer();
537 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538
Tony Barbourfe3351b2015-07-28 10:17:20 -0600539 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500540
541 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600542 if (failMask & BsoFailIndexBuffer) {
543 // Use DrawIndexed w/o an index buffer bound
544 DrawIndexed(3, 1, 0, 0, 0);
545 } else {
546 Draw(3, 1, 0, 0);
547 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500548
Mark Muellerd4914412016-06-13 17:52:06 -0600549 if (failMask & BsoFailCmdClearAttachments) {
550 VkClearAttachment color_attachment = {};
551 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700552 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600553 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
554
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600555 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600556 }
557
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500558 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700559 m_commandBuffer->EndRenderPass();
560 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600561 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562}
563
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600564void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
565 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500566 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600567 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500568 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600569 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500570 }
571
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800572 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700573 // Make sure depthWriteEnable is set so that Depth fail test will work
574 // correctly
575 // Make sure stencilTestEnable is set so that Stencil fail test will work
576 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600577 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800578 stencil.failOp = VK_STENCIL_OP_KEEP;
579 stencil.passOp = VK_STENCIL_OP_KEEP;
580 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
581 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600582
583 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
584 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600585 ds_ci.pNext = NULL;
586 ds_ci.depthTestEnable = VK_FALSE;
587 ds_ci.depthWriteEnable = VK_TRUE;
588 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
589 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600590 if (failMask & BsoFailDepthBounds) {
591 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600592 ds_ci.maxDepthBounds = 0.0f;
593 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600594 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600595 ds_ci.stencilTestEnable = VK_TRUE;
596 ds_ci.front = stencil;
597 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600598
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600599 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600600 pipelineobj.SetViewport(m_viewports);
601 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800602 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600603 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600604 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 commandBuffer->BindPipeline(pipelineobj);
606 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500607}
608
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600609class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700610 public:
611 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600612};
613
Ian Elliott2c1daf52016-05-12 09:41:46 -0600614class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
616 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600617 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600618};
619
Mark Muellerdfe37552016-07-07 14:47:42 -0600620class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700621 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600622 enum eTestEnFlags {
623 eDoubleDelete,
624 eInvalidDeviceOffset,
625 eInvalidMemoryOffset,
626 eBindNullBuffer,
627 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600628 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 };
630
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600631 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600632
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
634 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635 return true;
636 }
637 VkDeviceSize offset_limit = 0;
638 if (eInvalidMemoryOffset == aTestFlag) {
639 VkBuffer vulkanBuffer;
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600646 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600647
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
650 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600651 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
652 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600653 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600654 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600655 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600656 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 }
658 if (eOffsetAlignment < offset_limit) {
659 return true;
660 }
661 return false;
662 }
663
664 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
666 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (eBindNullBuffer == aTestFlag) {
668 VulkanMemory = 0;
669 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
670 } else {
671 VkBufferCreateInfo buffer_create_info = {};
672 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
673 buffer_create_info.size = 32;
674 buffer_create_info.usage = aBufferUsage;
675
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600676 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677
678 CreateCurrent = true;
679
680 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600681 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682
683 VkMemoryAllocateInfo memory_allocate_info = {};
684 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800685 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600686 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
687 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 if (!pass) {
689 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
690 return;
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600694 AllocateCurrent = true;
695 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600696 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
697 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 BoundCurrent = true;
699
700 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
701 }
702 }
703
704 ~VkBufferTest() {
705 if (CreateCurrent) {
706 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
707 }
708 if (AllocateCurrent) {
709 if (InvalidDeleteEn) {
710 union {
711 VkDeviceMemory device_memory;
712 unsigned long long index_access;
713 } bad_index;
714
715 bad_index.device_memory = VulkanMemory;
716 bad_index.index_access++;
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 }
720 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
721 }
722 }
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600725
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600727
728 void TestDoubleDestroy() {
729 // Destroy the buffer but leave the flag set, which will cause
730 // the buffer to be destroyed again in the destructor.
731 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
732 }
733
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700734 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600735 bool AllocateCurrent;
736 bool BoundCurrent;
737 bool CreateCurrent;
738 bool InvalidDeleteEn;
739
740 VkBuffer VulkanBuffer;
741 VkDevice VulkanDevice;
742 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600743};
744
745class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700746 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600747 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600748 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700749 : BoundCurrent(false),
750 AttributeCount(aAttributeCount),
751 BindingCount(aBindingCount),
752 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600753 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600754 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
755 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700756 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600757
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600758 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
759 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
762 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
763 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
764 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
765 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600766
767 unsigned i = 0;
768 do {
769 VertexInputAttributeDescription[i].binding = BindId;
770 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600771 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
772 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600773 i++;
774 } while (AttributeCount < i);
775
776 i = 0;
777 do {
778 VertexInputBindingDescription[i].binding = BindId;
779 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600780 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600781 i++;
782 } while (BindingCount < i);
783 }
784
785 ~VkVerticesObj() {
786 if (VertexInputAttributeDescription) {
787 delete[] VertexInputAttributeDescription;
788 }
789 if (VertexInputBindingDescription) {
790 delete[] VertexInputBindingDescription;
791 }
792 }
793
794 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
796 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600797 return true;
798 }
799
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600800 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600801 VkDeviceSize *offsetList;
802 unsigned offsetCount;
803
804 if (aOffsetCount) {
805 offsetList = aOffsetList;
806 offsetCount = aOffsetCount;
807 } else {
808 offsetList = new VkDeviceSize[1]();
809 offsetCount = 1;
810 }
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600813 BoundCurrent = true;
814
815 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600816 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600817 }
818 }
819
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700820 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600821 static uint32_t BindIdGenerator;
822
823 bool BoundCurrent;
824 unsigned AttributeCount;
825 unsigned BindingCount;
826 uint32_t BindId;
827
828 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
829 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
830 VkVertexInputBindingDescription *VertexInputBindingDescription;
831 VkConstantBufferObj VulkanMemoryBuffer;
832};
833
834uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500835// ********************************************************************************************************************
836// ********************************************************************************************************************
837// ********************************************************************************************************************
838// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700840 TEST_DESCRIPTION(
841 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
842 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600843
Tony Barbour1fa09702017-03-16 12:09:08 -0600844 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a pointer to a handle
848 // Expected to trigger an error with
849 // parameter_validation::validate_required_pointer
850 vkGetPhysicalDeviceFeatures(gpu(), NULL);
851 m_errorMonitor->VerifyFound();
852
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
854 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify NULL for pointer to array count
856 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600857 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600858 m_errorMonitor->VerifyFound();
859
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify 0 for a required array count
862 // Expected to trigger an error with parameter_validation::validate_array
863 VkViewport view_port = {};
864 m_commandBuffer->SetViewport(0, 0, &view_port);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify NULL for a required array
869 // Expected to trigger an error with parameter_validation::validate_array
870 m_commandBuffer->SetViewport(0, 1, NULL);
871 m_errorMonitor->VerifyFound();
872
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600874 // Specify VK_NULL_HANDLE for a required handle
875 // Expected to trigger an error with
876 // parameter_validation::validate_required_handle
877 vkUnmapMemory(device(), VK_NULL_HANDLE);
878 m_errorMonitor->VerifyFound();
879
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
881 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882 // Specify VK_NULL_HANDLE for a required handle array entry
883 // Expected to trigger an error with
884 // parameter_validation::validate_required_handle_array
885 VkFence fence = VK_NULL_HANDLE;
886 vkResetFences(device(), 1, &fence);
887 m_errorMonitor->VerifyFound();
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags parameter
899 // Expected to trigger an error with parameter_validation::validate_flags
900 m_commandBuffer->SetStencilReference(0, 0);
901 m_errorMonitor->VerifyFound();
902
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600904 // Specify 0 for a required VkFlags array entry
905 // Expected to trigger an error with
906 // parameter_validation::validate_flags_array
907 VkSemaphore semaphore = VK_NULL_HANDLE;
908 VkPipelineStageFlags stageFlags = 0;
909 VkSubmitInfo submitInfo = {};
910 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
911 submitInfo.waitSemaphoreCount = 1;
912 submitInfo.pWaitSemaphores = &semaphore;
913 submitInfo.pWaitDstStageMask = &stageFlags;
914 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
915 m_errorMonitor->VerifyFound();
916}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600917
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918TEST_F(VkLayerTest, ReservedParameter) {
919 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
920
Tony Barbour1fa09702017-03-16 12:09:08 -0600921 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600922
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600924 // Specify 0 for a reserved VkFlags parameter
925 // Expected to trigger an error with
926 // parameter_validation::validate_reserved_flags
927 VkEvent event_handle = VK_NULL_HANDLE;
928 VkEventCreateInfo event_info = {};
929 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
930 event_info.flags = 1;
931 vkCreateEvent(device(), &event_info, NULL, &event_handle);
932 m_errorMonitor->VerifyFound();
933}
934
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700936 TEST_DESCRIPTION(
937 "Specify an invalid VkStructureType for a Vulkan "
938 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939
Tony Barbour1fa09702017-03-16 12:09:08 -0600940 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600941
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943 // Zero struct memory, effectively setting sType to
944 // VK_STRUCTURE_TYPE_APPLICATION_INFO
945 // Expected to trigger an error with
946 // parameter_validation::validate_struct_type
947 VkMemoryAllocateInfo alloc_info = {};
948 VkDeviceMemory memory = VK_NULL_HANDLE;
949 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
950 m_errorMonitor->VerifyFound();
951
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600953 // Zero struct memory, effectively setting sType to
954 // VK_STRUCTURE_TYPE_APPLICATION_INFO
955 // Expected to trigger an error with
956 // parameter_validation::validate_struct_type_array
957 VkSubmitInfo submit_info = {};
958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
959 m_errorMonitor->VerifyFound();
960}
961
962TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600963 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600964
Tony Barbour1fa09702017-03-16 12:09:08 -0600965 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600966
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600968 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600969 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600970 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600971 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600972 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600973 // Zero-initialization will provide the correct sType
974 VkApplicationInfo app_info = {};
975 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
976 event_alloc_info.pNext = &app_info;
977 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
978 m_errorMonitor->VerifyFound();
979
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
981 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600982 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
983 // a function that has allowed pNext structure types and specify
984 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600985 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600987 VkMemoryAllocateInfo memory_alloc_info = {};
988 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
989 memory_alloc_info.pNext = &app_info;
990 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600991 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600992}
Dustin Graves5d33d532016-05-09 16:21:12 -0600993
994TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600995 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600996
Tony Barbour1fa09702017-03-16 12:09:08 -0600997 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1000 "does not fall within the begin..end "
1001 "range of the core VkFormat "
1002 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 // Specify an invalid VkFormat value
1004 // Expected to trigger an error with
1005 // parameter_validation::validate_ranged_enum
1006 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001007 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001008 m_errorMonitor->VerifyFound();
1009
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001011 // Specify an invalid VkFlags bitmask value
1012 // Expected to trigger an error with parameter_validation::validate_flags
1013 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001014 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1015 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001016 m_errorMonitor->VerifyFound();
1017
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001019 // Specify an invalid VkFlags array entry
1020 // Expected to trigger an error with
1021 // parameter_validation::validate_flags_array
1022 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001023 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001024 VkSubmitInfo submit_info = {};
1025 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1026 submit_info.waitSemaphoreCount = 1;
1027 submit_info.pWaitSemaphores = &semaphore;
1028 submit_info.pWaitDstStageMask = &stage_flags;
1029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1030 m_errorMonitor->VerifyFound();
1031
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001033 // Specify an invalid VkBool32 value
1034 // Expected to trigger a warning with
1035 // parameter_validation::validate_bool32
1036 VkSampler sampler = VK_NULL_HANDLE;
1037 VkSamplerCreateInfo sampler_info = {};
1038 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1039 sampler_info.pNext = NULL;
1040 sampler_info.magFilter = VK_FILTER_NEAREST;
1041 sampler_info.minFilter = VK_FILTER_NEAREST;
1042 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1043 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1044 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1045 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1046 sampler_info.mipLodBias = 1.0;
1047 sampler_info.maxAnisotropy = 1;
1048 sampler_info.compareEnable = VK_FALSE;
1049 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1050 sampler_info.minLod = 1.0;
1051 sampler_info.maxLod = 1.0;
1052 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1053 sampler_info.unnormalizedCoordinates = VK_FALSE;
1054 // Not VK_TRUE or VK_FALSE
1055 sampler_info.anisotropyEnable = 3;
1056 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1057 m_errorMonitor->VerifyFound();
1058}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001059
1060TEST_F(VkLayerTest, FailedReturnValue) {
1061 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1062
Tony Barbour1fa09702017-03-16 12:09:08 -06001063 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001064
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 // Find an unsupported image format
1066 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1067 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1068 VkFormat format = static_cast<VkFormat>(f);
1069 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001070 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001071 unsupported = format;
1072 break;
1073 }
1074 }
1075
1076 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1078 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001079 // Specify an unsupported VkFormat value to generate a
1080 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1081 // Expected to trigger a warning from
1082 // parameter_validation::validate_result
1083 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001084 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1085 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001086 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1087 m_errorMonitor->VerifyFound();
1088 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001089}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090
1091TEST_F(VkLayerTest, UpdateBufferAlignment) {
1092 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001093 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094
Tony Barbour1fa09702017-03-16 12:09:08 -06001095 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001096
1097 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1098 vk_testing::Buffer buffer;
1099 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1100
Tony Barbour552f6c02016-12-21 14:34:07 -07001101 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001102 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1105 m_errorMonitor->VerifyFound();
1106
1107 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using dataSize that is < 0
1113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001114 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001115 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1116 m_errorMonitor->VerifyFound();
1117
1118 // Introduce failure by using dataSize that is > 65536
1119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001120 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001121 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1122 m_errorMonitor->VerifyFound();
1123
Tony Barbour552f6c02016-12-21 14:34:07 -07001124 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001125}
1126
1127TEST_F(VkLayerTest, FillBufferAlignment) {
1128 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1129
Tony Barbour1fa09702017-03-16 12:09:08 -06001130 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001131
1132 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1133 vk_testing::Buffer buffer;
1134 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1135
Tony Barbour552f6c02016-12-21 14:34:07 -07001136 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001137
1138 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001140 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1141 m_errorMonitor->VerifyFound();
1142
1143 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001145 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1146 m_errorMonitor->VerifyFound();
1147
1148 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001150 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1151 m_errorMonitor->VerifyFound();
1152
Tony Barbour552f6c02016-12-21 14:34:07 -07001153 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001154}
Dustin Graves40f35822016-06-23 11:12:53 -06001155
Cortd889ff92016-07-27 09:51:27 -07001156TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1157 VkResult err;
1158
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001159 TEST_DESCRIPTION(
1160 "Attempt to use a non-solid polygon fill mode in a "
1161 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001162
Tony Barbour1fa09702017-03-16 12:09:08 -06001163 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1165
1166 std::vector<const char *> device_extension_names;
1167 auto features = m_device->phy().features();
1168 // Artificially disable support for non-solid fill modes
1169 features.fillModeNonSolid = false;
1170 // The sacrificial device object
1171 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1172
1173 VkRenderpassObj render_pass(&test_device);
1174
1175 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1176 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1177 pipeline_layout_ci.setLayoutCount = 0;
1178 pipeline_layout_ci.pSetLayouts = NULL;
1179
1180 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001181 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001182 ASSERT_VK_SUCCESS(err);
1183
1184 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1185 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1186 rs_ci.pNext = nullptr;
1187 rs_ci.lineWidth = 1.0f;
1188 rs_ci.rasterizerDiscardEnable = true;
1189
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001190 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1191 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001192
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001193 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1195 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001196 {
1197 VkPipelineObj pipe(&test_device);
1198 pipe.AddShader(&vs);
1199 pipe.AddShader(&fs);
1200 pipe.AddColorAttachment();
1201 // Introduce failure by setting unsupported polygon mode
1202 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1203 pipe.SetRasterization(&rs_ci);
1204 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1205 }
1206 m_errorMonitor->VerifyFound();
1207
1208 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1210 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001211 {
1212 VkPipelineObj pipe(&test_device);
1213 pipe.AddShader(&vs);
1214 pipe.AddShader(&fs);
1215 pipe.AddColorAttachment();
1216 // Introduce failure by setting unsupported polygon mode
1217 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1218 pipe.SetRasterization(&rs_ci);
1219 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1220 }
1221 m_errorMonitor->VerifyFound();
1222
Cortd889ff92016-07-27 09:51:27 -07001223 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1224}
1225
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001226#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001227TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001228{
1229 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001230 VkFenceCreateInfo fenceInfo = {};
1231 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1232 fenceInfo.pNext = NULL;
1233 fenceInfo.flags = 0;
1234
Mike Weiblencce7ec72016-10-17 19:33:05 -06001235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001236
Tony Barbour1fa09702017-03-16 12:09:08 -06001237 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001238
1239 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1240 vk_testing::Buffer buffer;
1241 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001242
Tony Barbourfe3351b2015-07-28 10:17:20 -06001243 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001244 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001245 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001246
1247 testFence.init(*m_device, fenceInfo);
1248
1249 // Bypass framework since it does the waits automatically
1250 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001251 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001252 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1253 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001254 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001255 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001256 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001257 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001258 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001259 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001260 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001261
1262 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001263 ASSERT_VK_SUCCESS( err );
1264
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001265 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001266 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001267
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001268 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001269}
1270
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001271TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001272{
1273 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001274 VkFenceCreateInfo fenceInfo = {};
1275 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1276 fenceInfo.pNext = NULL;
1277 fenceInfo.flags = 0;
1278
Mike Weiblencce7ec72016-10-17 19:33:05 -06001279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001280
Tony Barbour1fa09702017-03-16 12:09:08 -06001281 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001282 ASSERT_NO_FATAL_FAILURE(InitViewport());
1283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1284
Tony Barbourfe3351b2015-07-28 10:17:20 -06001285 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001286 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001287 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001288
1289 testFence.init(*m_device, fenceInfo);
1290
1291 // Bypass framework since it does the waits automatically
1292 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001293 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001294 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1295 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001296 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001297 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001298 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001299 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001300 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001301 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001302 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001303
1304 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001305 ASSERT_VK_SUCCESS( err );
1306
Jon Ashburnf19916e2016-01-11 13:12:43 -07001307 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001308 VkCommandBufferBeginInfo info = {};
1309 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1310 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001311 info.renderPass = VK_NULL_HANDLE;
1312 info.subpass = 0;
1313 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001314 info.occlusionQueryEnable = VK_FALSE;
1315 info.queryFlags = 0;
1316 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001317
1318 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001319 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001320
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001321 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001322}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001323#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001324
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001325TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1326 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1327
Tony Barbour1fa09702017-03-16 12:09:08 -06001328 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001329
1330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1331 VkBuffer buffer;
1332 VkBufferCreateInfo buf_info = {};
1333 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1334 buf_info.pNext = NULL;
1335 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1336 buf_info.size = 2048;
1337 buf_info.queueFamilyIndexCount = 0;
1338 buf_info.pQueueFamilyIndices = NULL;
1339 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1340 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1341 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1342 m_errorMonitor->VerifyFound();
1343
1344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1345 VkImage image;
1346 VkImageCreateInfo image_create_info = {};
1347 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1348 image_create_info.pNext = NULL;
1349 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1350 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1351 image_create_info.extent.width = 512;
1352 image_create_info.extent.height = 64;
1353 image_create_info.extent.depth = 1;
1354 image_create_info.mipLevels = 1;
1355 image_create_info.arrayLayers = 1;
1356 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1357 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1358 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1359 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1360 image_create_info.queueFamilyIndexCount = 0;
1361 image_create_info.pQueueFamilyIndices = NULL;
1362 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1363 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1364 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1365 m_errorMonitor->VerifyFound();
1366}
1367
Dave Houlton829c0d82017-01-24 15:09:17 -07001368TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1369 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1370
1371 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001372 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001373 ASSERT_NO_FATAL_FAILURE(
1374 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001375 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001376
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001377 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001378 device_features.sparseResidencyImage2D = VK_FALSE;
1379 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001380 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001381
1382 VkImage image = VK_NULL_HANDLE;
1383 VkResult result = VK_RESULT_MAX_ENUM;
1384 VkImageCreateInfo image_create_info = {};
1385 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1386 image_create_info.pNext = NULL;
1387 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1388 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1389 image_create_info.extent.width = 512;
1390 image_create_info.extent.height = 1;
1391 image_create_info.extent.depth = 1;
1392 image_create_info.mipLevels = 1;
1393 image_create_info.arrayLayers = 1;
1394 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1395 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1396 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1397 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1398 image_create_info.queueFamilyIndexCount = 0;
1399 image_create_info.pQueueFamilyIndices = NULL;
1400 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1401 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1402
1403 // 1D image w/ sparse residency is an error
1404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1405 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1406 m_errorMonitor->VerifyFound();
1407 if (VK_SUCCESS == result) {
1408 vkDestroyImage(m_device->device(), image, NULL);
1409 image = VK_NULL_HANDLE;
1410 }
1411
1412 // 2D image w/ sparse residency when feature isn't available
1413 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1414 image_create_info.extent.height = 64;
1415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1416 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1417 m_errorMonitor->VerifyFound();
1418 if (VK_SUCCESS == result) {
1419 vkDestroyImage(m_device->device(), image, NULL);
1420 image = VK_NULL_HANDLE;
1421 }
1422
1423 // 3D image w/ sparse residency when feature isn't available
1424 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1425 image_create_info.extent.depth = 8;
1426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1427 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1428 m_errorMonitor->VerifyFound();
1429 if (VK_SUCCESS == result) {
1430 vkDestroyImage(m_device->device(), image, NULL);
1431 image = VK_NULL_HANDLE;
1432 }
1433}
1434
1435TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1436 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1437
1438 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001439 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001440 ASSERT_NO_FATAL_FAILURE(
1441 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001442 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001443
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001444 // These tests require that the device support sparse residency for 2D images
1445 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1446 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001447 return;
1448 }
1449
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001450 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001451 device_features.sparseResidency2Samples = VK_FALSE;
1452 device_features.sparseResidency4Samples = VK_FALSE;
1453 device_features.sparseResidency8Samples = VK_FALSE;
1454 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001455 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001456
1457 VkImage image = VK_NULL_HANDLE;
1458 VkResult result = VK_RESULT_MAX_ENUM;
1459 VkImageCreateInfo image_create_info = {};
1460 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1461 image_create_info.pNext = NULL;
1462 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1463 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1464 image_create_info.extent.width = 64;
1465 image_create_info.extent.height = 64;
1466 image_create_info.extent.depth = 1;
1467 image_create_info.mipLevels = 1;
1468 image_create_info.arrayLayers = 1;
1469 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1470 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1471 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1472 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1473 image_create_info.queueFamilyIndexCount = 0;
1474 image_create_info.pQueueFamilyIndices = NULL;
1475 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1476 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1477
1478 // 2D image w/ sparse residency and linear tiling is an error
1479 m_errorMonitor->SetDesiredFailureMsg(
1480 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1481 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1482 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1483 m_errorMonitor->VerifyFound();
1484 if (VK_SUCCESS == result) {
1485 vkDestroyImage(m_device->device(), image, NULL);
1486 image = VK_NULL_HANDLE;
1487 }
1488 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1489
1490 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1491 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1493 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1494 m_errorMonitor->VerifyFound();
1495 if (VK_SUCCESS == result) {
1496 vkDestroyImage(m_device->device(), image, NULL);
1497 image = VK_NULL_HANDLE;
1498 }
1499
1500 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1502 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1503 m_errorMonitor->VerifyFound();
1504 if (VK_SUCCESS == result) {
1505 vkDestroyImage(m_device->device(), image, NULL);
1506 image = VK_NULL_HANDLE;
1507 }
1508
1509 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1511 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1512 m_errorMonitor->VerifyFound();
1513 if (VK_SUCCESS == result) {
1514 vkDestroyImage(m_device->device(), image, NULL);
1515 image = VK_NULL_HANDLE;
1516 }
1517
1518 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1520 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1521 m_errorMonitor->VerifyFound();
1522 if (VK_SUCCESS == result) {
1523 vkDestroyImage(m_device->device(), image, NULL);
1524 image = VK_NULL_HANDLE;
1525 }
1526}
1527
Tobin Ehlisf11be982016-05-11 13:52:53 -06001528TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001529 TEST_DESCRIPTION(
1530 "Create a buffer and image, allocate memory, and bind the "
1531 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001532 VkResult err;
1533 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001534 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001535
Tobin Ehlis077ded32016-05-12 17:39:13 -06001536 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001537 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001538 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001539 VkDeviceMemory mem; // buffer will be bound first
1540 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001541 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001542 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001543
1544 VkBufferCreateInfo buf_info = {};
1545 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1546 buf_info.pNext = NULL;
1547 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1548 buf_info.size = 256;
1549 buf_info.queueFamilyIndexCount = 0;
1550 buf_info.pQueueFamilyIndices = NULL;
1551 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1552 buf_info.flags = 0;
1553 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1554 ASSERT_VK_SUCCESS(err);
1555
Tobin Ehlis077ded32016-05-12 17:39:13 -06001556 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001557
1558 VkImageCreateInfo image_create_info = {};
1559 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1560 image_create_info.pNext = NULL;
1561 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1562 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1563 image_create_info.extent.width = 64;
1564 image_create_info.extent.height = 64;
1565 image_create_info.extent.depth = 1;
1566 image_create_info.mipLevels = 1;
1567 image_create_info.arrayLayers = 1;
1568 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001569 // Image tiling must be optimal to trigger error when aliasing linear buffer
1570 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001571 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1572 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1573 image_create_info.queueFamilyIndexCount = 0;
1574 image_create_info.pQueueFamilyIndices = NULL;
1575 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1576 image_create_info.flags = 0;
1577
Tobin Ehlisf11be982016-05-11 13:52:53 -06001578 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1579 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001580 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1581 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001582
Tobin Ehlis077ded32016-05-12 17:39:13 -06001583 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1584
1585 VkMemoryAllocateInfo alloc_info = {};
1586 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1587 alloc_info.pNext = NULL;
1588 alloc_info.memoryTypeIndex = 0;
1589 // Ensure memory is big enough for both bindings
1590 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001591 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1592 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001593 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001596 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001597 return;
1598 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001599 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1600 ASSERT_VK_SUCCESS(err);
1601 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1602 ASSERT_VK_SUCCESS(err);
1603
Rene Lindsayd14f5572016-12-16 14:57:18 -07001604 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1605
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001607 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001608 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1609 m_errorMonitor->VerifyFound();
1610
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001611 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001612 // aliasing buffer2
1613 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1614 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001615 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1616 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001617 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001618 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001620 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001621 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001622 m_errorMonitor->VerifyFound();
1623
1624 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001625 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001626 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001627 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001628 vkFreeMemory(m_device->device(), mem, NULL);
1629 vkFreeMemory(m_device->device(), mem_img, NULL);
1630}
1631
Tobin Ehlis35372522016-05-12 08:32:31 -06001632TEST_F(VkLayerTest, InvalidMemoryMapping) {
1633 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1634 VkResult err;
1635 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001636 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001637
1638 VkBuffer buffer;
1639 VkDeviceMemory mem;
1640 VkMemoryRequirements mem_reqs;
1641
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001642 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1643
Tobin Ehlis35372522016-05-12 08:32:31 -06001644 VkBufferCreateInfo buf_info = {};
1645 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1646 buf_info.pNext = NULL;
1647 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1648 buf_info.size = 256;
1649 buf_info.queueFamilyIndexCount = 0;
1650 buf_info.pQueueFamilyIndices = NULL;
1651 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1652 buf_info.flags = 0;
1653 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1654 ASSERT_VK_SUCCESS(err);
1655
1656 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1657 VkMemoryAllocateInfo alloc_info = {};
1658 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1659 alloc_info.pNext = NULL;
1660 alloc_info.memoryTypeIndex = 0;
1661
1662 // Ensure memory is big enough for both bindings
1663 static const VkDeviceSize allocation_size = 0x10000;
1664 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001665 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001666 if (!pass) {
1667 vkDestroyBuffer(m_device->device(), buffer, NULL);
1668 return;
1669 }
1670 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1671 ASSERT_VK_SUCCESS(err);
1672
1673 uint8_t *pData;
1674 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001676 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1677 m_errorMonitor->VerifyFound();
1678 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001679 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001680 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1682 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1683 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001684 m_errorMonitor->VerifyFound();
1685
1686 // Unmap the memory to avoid re-map error
1687 vkUnmapMemory(m_device->device(), mem);
1688 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1690 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1691 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001692 m_errorMonitor->VerifyFound();
1693 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1695 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001696 m_errorMonitor->VerifyFound();
1697 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001699 vkUnmapMemory(m_device->device(), mem);
1700 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001701
Tobin Ehlis35372522016-05-12 08:32:31 -06001702 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001703 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001704 ASSERT_VK_SUCCESS(err);
1705 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001706 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001707 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001708 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001710 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1711 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001712
Tobin Ehlis35372522016-05-12 08:32:31 -06001713 // Now flush range that oversteps mapped range
1714 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001715 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001716 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001717 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001718 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1720 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1721 m_errorMonitor->VerifyFound();
1722
1723 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1724 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001725 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001726 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001727 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001728 mmr.size = VK_WHOLE_SIZE;
1729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001730 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1731 m_errorMonitor->VerifyFound();
1732
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001733#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001734 // Some platforms have an atomsize of 1 which makes the test meaningless
1735 if (atom_size > 3) {
1736 // Now with an offset NOT a multiple of the device limit
1737 vkUnmapMemory(m_device->device(), mem);
1738 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1739 ASSERT_VK_SUCCESS(err);
1740 mmr.offset = 3; // Not a multiple of atom_size
1741 mmr.size = VK_WHOLE_SIZE;
1742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1743 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1744 m_errorMonitor->VerifyFound();
1745
1746 // Now with a size NOT a multiple of the device limit
1747 vkUnmapMemory(m_device->device(), mem);
1748 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1749 ASSERT_VK_SUCCESS(err);
1750 mmr.offset = atom_size;
1751 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1753 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1754 m_errorMonitor->VerifyFound();
1755 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001756#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001757 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1758 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001759 if (!pass) {
1760 vkFreeMemory(m_device->device(), mem, NULL);
1761 vkDestroyBuffer(m_device->device(), buffer, NULL);
1762 return;
1763 }
1764 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1765 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1766
1767 vkDestroyBuffer(m_device->device(), buffer, NULL);
1768 vkFreeMemory(m_device->device(), mem, NULL);
1769}
1770
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001771#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001772TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1773 VkResult err;
1774 bool pass;
1775
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001776 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1777 // following declaration (which is temporarily being moved below):
1778 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001779 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001780 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001781 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001782 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001783 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001784 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001785
Tony Barbour1fa09702017-03-16 12:09:08 -06001786 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001787
Ian Elliott3f06ce52016-04-29 14:46:21 -06001788#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1789#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1790 // Use the functions from the VK_KHR_android_surface extension without
1791 // enabling that extension:
1792
1793 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001794 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1796 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001797 pass = (err != VK_SUCCESS);
1798 ASSERT_TRUE(pass);
1799 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001800#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001801
Ian Elliott3f06ce52016-04-29 14:46:21 -06001802#if defined(VK_USE_PLATFORM_MIR_KHR)
1803 // Use the functions from the VK_KHR_mir_surface extension without enabling
1804 // that extension:
1805
1806 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001807 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001809 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1810 pass = (err != VK_SUCCESS);
1811 ASSERT_TRUE(pass);
1812 m_errorMonitor->VerifyFound();
1813
1814 // Tell whether an mir_connection supports presentation:
1815 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1817 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001819#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001820
Ian Elliott3f06ce52016-04-29 14:46:21 -06001821#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1822 // Use the functions from the VK_KHR_wayland_surface extension without
1823 // enabling that extension:
1824
1825 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001826 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1828 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001829 pass = (err != VK_SUCCESS);
1830 ASSERT_TRUE(pass);
1831 m_errorMonitor->VerifyFound();
1832
1833 // Tell whether an wayland_display supports presentation:
1834 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1836 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001837 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001838#endif // VK_USE_PLATFORM_WAYLAND_KHR
1839#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001840
Ian Elliott3f06ce52016-04-29 14:46:21 -06001841#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001842 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1843 // TO NON-LINUX PLATFORMS:
1844 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001845 // Use the functions from the VK_KHR_win32_surface extension without
1846 // enabling that extension:
1847
1848 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001849 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1851 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001852 pass = (err != VK_SUCCESS);
1853 ASSERT_TRUE(pass);
1854 m_errorMonitor->VerifyFound();
1855
1856 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001858 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001859 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001860// Set this (for now, until all platforms are supported and tested):
1861#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001862#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001863#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001864 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1865 // TO NON-LINUX PLATFORMS:
1866 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001867#endif
1868#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001869 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1870 // that extension:
1871
1872 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001873 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001875 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1876 pass = (err != VK_SUCCESS);
1877 ASSERT_TRUE(pass);
1878 m_errorMonitor->VerifyFound();
1879
1880 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001881 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001882 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1884 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001886// Set this (for now, until all platforms are supported and tested):
1887#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001888#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001889
Ian Elliott12630812016-04-29 14:35:43 -06001890#if defined(VK_USE_PLATFORM_XLIB_KHR)
1891 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1892 // that extension:
1893
1894 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001895 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001897 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1898 pass = (err != VK_SUCCESS);
1899 ASSERT_TRUE(pass);
1900 m_errorMonitor->VerifyFound();
1901
1902 // Tell whether an Xlib VisualID supports presentation:
1903 Display *dpy = NULL;
1904 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001906 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1907 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001908// Set this (for now, until all platforms are supported and tested):
1909#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001910#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001911
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001912// Use the functions from the VK_KHR_surface extension without enabling
1913// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001914
Ian Elliott489eec02016-05-05 14:12:44 -06001915#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001916 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001918 vkDestroySurfaceKHR(instance(), surface, NULL);
1919 m_errorMonitor->VerifyFound();
1920
1921 // Check if surface supports presentation:
1922 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001924 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1925 pass = (err != VK_SUCCESS);
1926 ASSERT_TRUE(pass);
1927 m_errorMonitor->VerifyFound();
1928
1929 // Check surface capabilities:
1930 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1932 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001933 pass = (err != VK_SUCCESS);
1934 ASSERT_TRUE(pass);
1935 m_errorMonitor->VerifyFound();
1936
1937 // Check surface formats:
1938 uint32_t format_count = 0;
1939 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1941 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001942 pass = (err != VK_SUCCESS);
1943 ASSERT_TRUE(pass);
1944 m_errorMonitor->VerifyFound();
1945
1946 // Check surface present modes:
1947 uint32_t present_mode_count = 0;
1948 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1950 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001951 pass = (err != VK_SUCCESS);
1952 ASSERT_TRUE(pass);
1953 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001954#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001955
Ian Elliott1c32c772016-04-28 14:47:13 -06001956 // Use the functions from the VK_KHR_swapchain extension without enabling
1957 // that extension:
1958
1959 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001961 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1962 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001963 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001964 pass = (err != VK_SUCCESS);
1965 ASSERT_TRUE(pass);
1966 m_errorMonitor->VerifyFound();
1967
1968 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1970 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001971 pass = (err != VK_SUCCESS);
1972 ASSERT_TRUE(pass);
1973 m_errorMonitor->VerifyFound();
1974
Chris Forbeseb7d5502016-09-13 18:19:21 +12001975 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1976 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1977 VkFence fence;
1978 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1979
Ian Elliott1c32c772016-04-28 14:47:13 -06001980 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001982 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001983 pass = (err != VK_SUCCESS);
1984 ASSERT_TRUE(pass);
1985 m_errorMonitor->VerifyFound();
1986
Chris Forbeseb7d5502016-09-13 18:19:21 +12001987 vkDestroyFence(m_device->device(), fence, nullptr);
1988
Ian Elliott1c32c772016-04-28 14:47:13 -06001989 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001990 //
1991 // NOTE: Currently can't test this because a real swapchain is needed (as
1992 // opposed to the fake one we created) in order for the layer to lookup the
1993 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001994
1995 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001997 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1998 m_errorMonitor->VerifyFound();
1999}
Chris Forbes09368e42016-10-13 11:59:22 +13002000#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06002001
Karl Schultz6addd812016-02-02 17:17:23 -07002002TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2003 VkResult err;
2004 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002005
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2007 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002008
Tony Barbour1fa09702017-03-16 12:09:08 -06002009 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002010
2011 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002012 VkImage image;
2013 VkDeviceMemory mem;
2014 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002015
Karl Schultz6addd812016-02-02 17:17:23 -07002016 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2017 const int32_t tex_width = 32;
2018 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002019
Tony Barboureb254902015-07-15 12:50:33 -06002020 VkImageCreateInfo image_create_info = {};
2021 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002022 image_create_info.pNext = NULL;
2023 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2024 image_create_info.format = tex_format;
2025 image_create_info.extent.width = tex_width;
2026 image_create_info.extent.height = tex_height;
2027 image_create_info.extent.depth = 1;
2028 image_create_info.mipLevels = 1;
2029 image_create_info.arrayLayers = 1;
2030 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2031 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2032 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2033 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002034 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002035
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002036 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002037 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002038 mem_alloc.pNext = NULL;
2039 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040
Chia-I Wuf7458c52015-10-26 21:10:41 +08002041 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002042 ASSERT_VK_SUCCESS(err);
2043
Karl Schultz6addd812016-02-02 17:17:23 -07002044 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002045
Mark Lobodzinski23065352015-05-29 09:32:35 -05002046 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002047
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002048 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002049 if (!pass) { // If we can't find any unmappable memory this test doesn't
2050 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002051 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002052 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002053 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002054
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002055 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002056 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002057 ASSERT_VK_SUCCESS(err);
2058
2059 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002060 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002061 ASSERT_VK_SUCCESS(err);
2062
2063 // Map memory as if to initialize the image
2064 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002065 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002066
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002067 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002068
Chia-I Wuf7458c52015-10-26 21:10:41 +08002069 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002070 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002071}
2072
Karl Schultz6addd812016-02-02 17:17:23 -07002073TEST_F(VkLayerTest, RebindMemory) {
2074 VkResult err;
2075 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002078
Tony Barbour1fa09702017-03-16 12:09:08 -06002079 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002080
2081 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002082 VkImage image;
2083 VkDeviceMemory mem1;
2084 VkDeviceMemory mem2;
2085 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002086
Karl Schultz6addd812016-02-02 17:17:23 -07002087 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2088 const int32_t tex_width = 32;
2089 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002090
Tony Barboureb254902015-07-15 12:50:33 -06002091 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002092 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2093 image_create_info.pNext = NULL;
2094 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2095 image_create_info.format = tex_format;
2096 image_create_info.extent.width = tex_width;
2097 image_create_info.extent.height = tex_height;
2098 image_create_info.extent.depth = 1;
2099 image_create_info.mipLevels = 1;
2100 image_create_info.arrayLayers = 1;
2101 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2102 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2103 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2104 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002105
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002106 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002107 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2108 mem_alloc.pNext = NULL;
2109 mem_alloc.allocationSize = 0;
2110 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 // Introduce failure, do NOT set memProps to
2113 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002114 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002115 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002116 ASSERT_VK_SUCCESS(err);
2117
Karl Schultz6addd812016-02-02 17:17:23 -07002118 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002119
2120 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002121 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002122 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002123
2124 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002125 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002126 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002127 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002128 ASSERT_VK_SUCCESS(err);
2129
2130 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002131 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002132 ASSERT_VK_SUCCESS(err);
2133
Karl Schultz6addd812016-02-02 17:17:23 -07002134 // Introduce validation failure, try to bind a different memory object to
2135 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002136 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002137
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002138 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002139
Chia-I Wuf7458c52015-10-26 21:10:41 +08002140 vkDestroyImage(m_device->device(), image, NULL);
2141 vkFreeMemory(m_device->device(), mem1, NULL);
2142 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002143}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002144
Karl Schultz6addd812016-02-02 17:17:23 -07002145TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002146 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002147
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2149 "submitted in SIGNALED state. Fences "
2150 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002151
2152 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002153 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2154 fenceInfo.pNext = NULL;
2155 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002156
Tony Barbour1fa09702017-03-16 12:09:08 -06002157 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002158 ASSERT_NO_FATAL_FAILURE(InitViewport());
2159 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2160
Tony Barbour552f6c02016-12-21 14:34:07 -07002161 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002163 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002164
2165 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002166
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002167 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002168 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2169 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002170 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002171 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002172 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002173 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002174 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002175 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002176 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002177
2178 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002179 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002180
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002181 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002182}
Chris Forbes4e44c912016-06-16 10:20:00 +12002183
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002184TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002185 TEST_DESCRIPTION(
2186 "Specify wrong usage for image then create conflicting view of image "
2187 "Initialize buffer with wrong usage then perform copy expecting errors "
2188 "from both the image and the buffer (2 calls)");
Mark Lobodzinski33826372017-04-13 11:10:11 -06002189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for Image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002190
Tony Barbour1fa09702017-03-16 12:09:08 -06002191 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002192 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002193 if (!format) {
2194 printf(" No Depth + Stencil format found. Skipped.\n");
2195 return;
2196 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002197
Tony Barbourf92621a2016-05-02 14:28:12 -06002198 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002199 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002200 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002201 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002202
Tony Barbourf92621a2016-05-02 14:28:12 -06002203 VkImageView dsv;
2204 VkImageViewCreateInfo dsvci = {};
2205 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2206 dsvci.image = image.handle();
2207 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002208 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002209 dsvci.subresourceRange.layerCount = 1;
2210 dsvci.subresourceRange.baseMipLevel = 0;
2211 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002212 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002213
Tony Barbourf92621a2016-05-02 14:28:12 -06002214 // Create a view with depth / stencil aspect for image with different usage
2215 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002216
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002217 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002218
2219 // Initialize buffer with TRANSFER_DST usage
2220 vk_testing::Buffer buffer;
2221 VkMemoryPropertyFlags reqs = 0;
2222 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2223 VkBufferImageCopy region = {};
2224 region.bufferRowLength = 128;
2225 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002226 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002227 region.imageSubresource.layerCount = 1;
2228 region.imageExtent.height = 16;
2229 region.imageExtent.width = 16;
2230 region.imageExtent.depth = 1;
2231
Mark Lobodzinski80871462017-02-16 10:37:27 -07002232 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002233 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002234
Chris Forbesda581202016-10-06 18:25:26 +13002235 // two separate errors from this call:
Mark Lobodzinski33826372017-04-13 11:10:11 -06002236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Chris Forbesda581202016-10-06 18:25:26 +13002238
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002239 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2240 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002241 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002242}
Tony Barbour75d79f02016-08-30 09:39:07 -06002243
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002244TEST_F(VkLayerTest, LeakAnObject) {
2245 VkResult err;
2246
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002247 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002248
2249 // Note that we have to create a new device since destroying the
2250 // framework's device causes Teardown() to fail and just calling Teardown
2251 // will destroy the errorMonitor.
2252
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002254
Tony Barbour1fa09702017-03-16 12:09:08 -06002255 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002256
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002257 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002258 std::vector<VkDeviceQueueCreateInfo> queue_info;
2259 queue_info.reserve(queue_props.size());
2260 std::vector<std::vector<float>> queue_priorities;
2261 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2262 VkDeviceQueueCreateInfo qi = {};
2263 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2264 qi.pNext = NULL;
2265 qi.queueFamilyIndex = i;
2266 qi.queueCount = queue_props[i].queueCount;
2267 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2268 qi.pQueuePriorities = queue_priorities[i].data();
2269 queue_info.push_back(qi);
2270 }
2271
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002272 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002273
2274 // The sacrificial device object
2275 VkDevice testDevice;
2276 VkDeviceCreateInfo device_create_info = {};
2277 auto features = m_device->phy().features();
2278 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2279 device_create_info.pNext = NULL;
2280 device_create_info.queueCreateInfoCount = queue_info.size();
2281 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002282 device_create_info.enabledLayerCount = 0;
2283 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002284 device_create_info.pEnabledFeatures = &features;
2285 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2286 ASSERT_VK_SUCCESS(err);
2287
2288 VkFence fence;
2289 VkFenceCreateInfo fence_create_info = {};
2290 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2291 fence_create_info.pNext = NULL;
2292 fence_create_info.flags = 0;
2293 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2294 ASSERT_VK_SUCCESS(err);
2295
2296 // Induce failure by not calling vkDestroyFence
2297 vkDestroyDevice(testDevice, NULL);
2298 m_errorMonitor->VerifyFound();
2299}
2300
2301TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002302 TEST_DESCRIPTION(
2303 "Allocate command buffers from one command pool and "
2304 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307
Tony Barbour1fa09702017-03-16 12:09:08 -06002308 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002309 VkCommandPool command_pool_one;
2310 VkCommandPool command_pool_two;
2311
2312 VkCommandPoolCreateInfo pool_create_info{};
2313 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2314 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2315 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2316
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002317 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002318
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002319 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002320
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002321 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002323 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002325 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002326 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002327 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002328
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002329 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002330
2331 m_errorMonitor->VerifyFound();
2332
2333 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2334 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2335}
2336
2337TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2338 VkResult err;
2339
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002340 TEST_DESCRIPTION(
2341 "Allocate descriptor sets from one DS pool and "
2342 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002343
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002345
Tony Barbour1fa09702017-03-16 12:09:08 -06002346 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2348
2349 VkDescriptorPoolSize ds_type_count = {};
2350 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2351 ds_type_count.descriptorCount = 1;
2352
2353 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2354 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2355 ds_pool_ci.pNext = NULL;
2356 ds_pool_ci.flags = 0;
2357 ds_pool_ci.maxSets = 1;
2358 ds_pool_ci.poolSizeCount = 1;
2359 ds_pool_ci.pPoolSizes = &ds_type_count;
2360
2361 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002363 ASSERT_VK_SUCCESS(err);
2364
2365 // Create a second descriptor pool
2366 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002367 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002368 ASSERT_VK_SUCCESS(err);
2369
2370 VkDescriptorSetLayoutBinding dsl_binding = {};
2371 dsl_binding.binding = 0;
2372 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2373 dsl_binding.descriptorCount = 1;
2374 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2375 dsl_binding.pImmutableSamplers = NULL;
2376
2377 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2378 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2379 ds_layout_ci.pNext = NULL;
2380 ds_layout_ci.bindingCount = 1;
2381 ds_layout_ci.pBindings = &dsl_binding;
2382
2383 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002384 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002385 ASSERT_VK_SUCCESS(err);
2386
2387 VkDescriptorSet descriptorSet;
2388 VkDescriptorSetAllocateInfo alloc_info = {};
2389 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2390 alloc_info.descriptorSetCount = 1;
2391 alloc_info.descriptorPool = ds_pool_one;
2392 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002393 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002394 ASSERT_VK_SUCCESS(err);
2395
2396 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2397
2398 m_errorMonitor->VerifyFound();
2399
2400 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2401 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2402 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2403}
2404
2405TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002407
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002408 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002409
Tony Barbour1fa09702017-03-16 12:09:08 -06002410 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002411
2412 // Pass bogus handle into GetImageMemoryRequirements
2413 VkMemoryRequirements mem_reqs;
2414 uint64_t fakeImageHandle = 0xCADECADE;
2415 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2416
2417 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2418
2419 m_errorMonitor->VerifyFound();
2420}
2421
Mike Schuchardt17838902017-02-21 09:48:06 -07002422TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2423 TEST_DESCRIPTION(
2424 "Try to destroy a render pass object using a device other than the one it was created on. "
2425 "This should generate a distinct error from the invalid handle error.");
2426 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002427 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2429
2430 // Create second device
2431 float priorities[] = {1.0f};
2432 VkDeviceQueueCreateInfo queue_info{};
2433 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2434 queue_info.pNext = NULL;
2435 queue_info.flags = 0;
2436 queue_info.queueFamilyIndex = 0;
2437 queue_info.queueCount = 1;
2438 queue_info.pQueuePriorities = &priorities[0];
2439
2440 VkDeviceCreateInfo device_create_info = {};
2441 auto features = m_device->phy().features();
2442 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2443 device_create_info.pNext = NULL;
2444 device_create_info.queueCreateInfoCount = 1;
2445 device_create_info.pQueueCreateInfos = &queue_info;
2446 device_create_info.enabledLayerCount = 0;
2447 device_create_info.ppEnabledLayerNames = NULL;
2448 device_create_info.pEnabledFeatures = &features;
2449
2450 VkDevice second_device;
2451 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2452
2453 // Try to destroy the renderpass from the first device using the second device
2454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2455 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2456 m_errorMonitor->VerifyFound();
2457
2458 vkDestroyDevice(second_device, NULL);
2459}
2460
Karl Schultz6addd812016-02-02 17:17:23 -07002461TEST_F(VkLayerTest, PipelineNotBound) {
2462 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002464 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002465
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002467
Tony Barbour1fa09702017-03-16 12:09:08 -06002468 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002470
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002471 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002472 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2473 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002474
2475 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002476 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2477 ds_pool_ci.pNext = NULL;
2478 ds_pool_ci.maxSets = 1;
2479 ds_pool_ci.poolSizeCount = 1;
2480 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002481
2482 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002483 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002484 ASSERT_VK_SUCCESS(err);
2485
2486 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002487 dsl_binding.binding = 0;
2488 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2489 dsl_binding.descriptorCount = 1;
2490 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2491 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
2493 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002494 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2495 ds_layout_ci.pNext = NULL;
2496 ds_layout_ci.bindingCount = 1;
2497 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002498
2499 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002500 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002501 ASSERT_VK_SUCCESS(err);
2502
2503 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002504 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002505 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002506 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002507 alloc_info.descriptorPool = ds_pool;
2508 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002509 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002510 ASSERT_VK_SUCCESS(err);
2511
2512 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002513 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2514 pipeline_layout_ci.pNext = NULL;
2515 pipeline_layout_ci.setLayoutCount = 1;
2516 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002517
2518 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002519 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002520 ASSERT_VK_SUCCESS(err);
2521
Mark Youngad779052016-01-06 14:26:04 -07002522 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002523
Tony Barbour552f6c02016-12-21 14:34:07 -07002524 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002525 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002526
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002527 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002528
Chia-I Wuf7458c52015-10-26 21:10:41 +08002529 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2531 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002532}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002533
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002534TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2535 VkResult err;
2536
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002537 TEST_DESCRIPTION(
2538 "Test validation check for an invalid memory type index "
2539 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002540
Tony Barbour1fa09702017-03-16 12:09:08 -06002541 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002542
2543 // Create an image, allocate memory, set a bad typeIndex and then try to
2544 // bind it
2545 VkImage image;
2546 VkDeviceMemory mem;
2547 VkMemoryRequirements mem_reqs;
2548 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2549 const int32_t tex_width = 32;
2550 const int32_t tex_height = 32;
2551
2552 VkImageCreateInfo image_create_info = {};
2553 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2554 image_create_info.pNext = NULL;
2555 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2556 image_create_info.format = tex_format;
2557 image_create_info.extent.width = tex_width;
2558 image_create_info.extent.height = tex_height;
2559 image_create_info.extent.depth = 1;
2560 image_create_info.mipLevels = 1;
2561 image_create_info.arrayLayers = 1;
2562 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2563 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2564 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2565 image_create_info.flags = 0;
2566
2567 VkMemoryAllocateInfo mem_alloc = {};
2568 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2569 mem_alloc.pNext = NULL;
2570 mem_alloc.allocationSize = 0;
2571 mem_alloc.memoryTypeIndex = 0;
2572
2573 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2574 ASSERT_VK_SUCCESS(err);
2575
2576 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2577 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002578
2579 // Introduce Failure, select invalid TypeIndex
2580 VkPhysicalDeviceMemoryProperties memory_info;
2581
2582 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2583 unsigned int i;
2584 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2585 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2586 mem_alloc.memoryTypeIndex = i;
2587 break;
2588 }
2589 }
2590 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002591 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002592 vkDestroyImage(m_device->device(), image, NULL);
2593 return;
2594 }
2595
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002597
2598 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2599 ASSERT_VK_SUCCESS(err);
2600
2601 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2602 (void)err;
2603
2604 m_errorMonitor->VerifyFound();
2605
2606 vkDestroyImage(m_device->device(), image, NULL);
2607 vkFreeMemory(m_device->device(), mem, NULL);
2608}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002609
Karl Schultz6addd812016-02-02 17:17:23 -07002610TEST_F(VkLayerTest, BindInvalidMemory) {
2611 VkResult err;
2612 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
Tony Barbour1fa09702017-03-16 12:09:08 -06002614 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002615
Cortf801b982017-01-17 18:10:21 -08002616 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002617 const int32_t tex_width = 256;
2618 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002619
2620 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002621 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2622 image_create_info.pNext = NULL;
2623 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2624 image_create_info.format = tex_format;
2625 image_create_info.extent.width = tex_width;
2626 image_create_info.extent.height = tex_height;
2627 image_create_info.extent.depth = 1;
2628 image_create_info.mipLevels = 1;
2629 image_create_info.arrayLayers = 1;
2630 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002631 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002632 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2633 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002634
Cortf801b982017-01-17 18:10:21 -08002635 VkBufferCreateInfo buffer_create_info = {};
2636 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2637 buffer_create_info.pNext = NULL;
2638 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002639 buffer_create_info.size = 4 * 1024 * 1024;
2640 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002641 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002642
Cortf801b982017-01-17 18:10:21 -08002643 // Create an image/buffer, allocate memory, free it, and then try to bind it
2644 {
2645 VkImage image = VK_NULL_HANDLE;
2646 VkBuffer buffer = VK_NULL_HANDLE;
2647 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2648 ASSERT_VK_SUCCESS(err);
2649 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2650 ASSERT_VK_SUCCESS(err);
2651 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2652 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2653 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002654
Cortf801b982017-01-17 18:10:21 -08002655 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2656 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2657 image_mem_alloc.allocationSize = image_mem_reqs.size;
2658 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2659 ASSERT_TRUE(pass);
2660 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2661 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2662 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2663 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002664
Cortf801b982017-01-17 18:10:21 -08002665 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2666 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2667 ASSERT_VK_SUCCESS(err);
2668 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2669 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002670
Cortf801b982017-01-17 18:10:21 -08002671 vkFreeMemory(device(), image_mem, NULL);
2672 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002673
Cortf801b982017-01-17 18:10:21 -08002674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2675 err = vkBindImageMemory(device(), image, image_mem, 0);
2676 (void)err; // This may very well return an error.
2677 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002678
Cortf801b982017-01-17 18:10:21 -08002679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2680 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2681 (void)err; // This may very well return an error.
2682 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002683
Cortf801b982017-01-17 18:10:21 -08002684 vkDestroyImage(m_device->device(), image, NULL);
2685 vkDestroyBuffer(m_device->device(), buffer, NULL);
2686 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002687
2688 // Try to bind memory to an object that already has a memory binding
2689 {
2690 VkImage image = VK_NULL_HANDLE;
2691 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2692 ASSERT_VK_SUCCESS(err);
2693 VkBuffer buffer = VK_NULL_HANDLE;
2694 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2695 ASSERT_VK_SUCCESS(err);
2696 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2697 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2698 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2699 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2700 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2701 image_alloc_info.allocationSize = image_mem_reqs.size;
2702 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2703 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2704 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2705 ASSERT_TRUE(pass);
2706 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2707 ASSERT_TRUE(pass);
2708 VkDeviceMemory image_mem, buffer_mem;
2709 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2710 ASSERT_VK_SUCCESS(err);
2711 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2712 ASSERT_VK_SUCCESS(err);
2713
2714 err = vkBindImageMemory(device(), image, image_mem, 0);
2715 ASSERT_VK_SUCCESS(err);
2716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2717 err = vkBindImageMemory(device(), image, image_mem, 0);
2718 (void)err; // This may very well return an error.
2719 m_errorMonitor->VerifyFound();
2720
2721 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2722 ASSERT_VK_SUCCESS(err);
2723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2724 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2725 (void)err; // This may very well return an error.
2726 m_errorMonitor->VerifyFound();
2727
2728 vkFreeMemory(device(), image_mem, NULL);
2729 vkFreeMemory(device(), buffer_mem, NULL);
2730 vkDestroyImage(device(), image, NULL);
2731 vkDestroyBuffer(device(), buffer, NULL);
2732 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002733
Cort Strattonde748202017-02-17 12:50:01 -08002734 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002735 {
2736 VkImage image = VK_NULL_HANDLE;
2737 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2738 ASSERT_VK_SUCCESS(err);
2739 VkBuffer buffer = VK_NULL_HANDLE;
2740 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2741 ASSERT_VK_SUCCESS(err);
2742 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2743 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2744 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2745 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2746 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002747 // Leave some extra space for alignment wiggle room
2748 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002749 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002750 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002751 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2752 ASSERT_TRUE(pass);
2753 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2754 ASSERT_TRUE(pass);
2755 VkDeviceMemory image_mem, buffer_mem;
2756 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2757 ASSERT_VK_SUCCESS(err);
2758 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2759 ASSERT_VK_SUCCESS(err);
2760
Cort Strattonde748202017-02-17 12:50:01 -08002761 // Test unaligned memory offset
2762 {
2763 if (image_mem_reqs.alignment > 1) {
2764 VkDeviceSize image_offset = 1;
2765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2766 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2767 (void)err; // This may very well return an error.
2768 m_errorMonitor->VerifyFound();
2769 }
Cort6c7dff72017-01-27 18:34:50 -08002770
Cort Strattonde748202017-02-17 12:50:01 -08002771 if (buffer_mem_reqs.alignment > 1) {
2772 VkDeviceSize buffer_offset = 1;
2773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2774 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2775 (void)err; // This may very well return an error.
2776 m_errorMonitor->VerifyFound();
2777 }
2778 }
2779
2780 // Test memory offsets outside the memory allocation
2781 {
2782 VkDeviceSize image_offset =
2783 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2785 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2786 (void)err; // This may very well return an error.
2787 m_errorMonitor->VerifyFound();
2788
2789 VkDeviceSize buffer_offset =
2790 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2792 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2793 (void)err; // This may very well return an error.
2794 m_errorMonitor->VerifyFound();
2795 }
2796
2797 // Test memory offsets within the memory allocation, but which leave too little memory for
2798 // the resource.
2799 {
2800 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002801 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2803 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2804 (void)err; // This may very well return an error.
2805 m_errorMonitor->VerifyFound();
2806 }
2807
2808 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2809 if (buffer_offset > 0) {
2810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2811 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2812 (void)err; // This may very well return an error.
2813 m_errorMonitor->VerifyFound();
2814 }
2815 }
Cort6c7dff72017-01-27 18:34:50 -08002816
2817 vkFreeMemory(device(), image_mem, NULL);
2818 vkFreeMemory(device(), buffer_mem, NULL);
2819 vkDestroyImage(device(), image, NULL);
2820 vkDestroyBuffer(device(), buffer, NULL);
2821 }
2822
Cort Stratton4c38bb52017-01-28 13:33:10 -08002823 // Try to bind memory to an object with an invalid memory type
2824 {
2825 VkImage image = VK_NULL_HANDLE;
2826 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2827 ASSERT_VK_SUCCESS(err);
2828 VkBuffer buffer = VK_NULL_HANDLE;
2829 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2830 ASSERT_VK_SUCCESS(err);
2831 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2832 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2833 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2834 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2835 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2836 image_alloc_info.allocationSize = image_mem_reqs.size;
2837 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2838 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 // Create a mask of available memory types *not* supported by these resources,
2840 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002841 VkPhysicalDeviceMemoryProperties memory_properties = {};
2842 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002843 VkDeviceMemory image_mem, buffer_mem;
2844
Cort Stratton4c38bb52017-01-28 13:33:10 -08002845 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002846 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002847 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2848 ASSERT_TRUE(pass);
2849 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2850 ASSERT_VK_SUCCESS(err);
2851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2852 err = vkBindImageMemory(device(), image, image_mem, 0);
2853 (void)err; // This may very well return an error.
2854 m_errorMonitor->VerifyFound();
2855 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002856 }
2857
Cort Stratton4c38bb52017-01-28 13:33:10 -08002858 uint32_t buffer_unsupported_mem_type_bits =
2859 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002860 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002861 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2862 ASSERT_TRUE(pass);
2863 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2864 ASSERT_VK_SUCCESS(err);
2865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2866 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2867 (void)err; // This may very well return an error.
2868 m_errorMonitor->VerifyFound();
2869 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002870 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002871
Cort Stratton4c38bb52017-01-28 13:33:10 -08002872 vkDestroyImage(device(), image, NULL);
2873 vkDestroyBuffer(device(), buffer, NULL);
2874 }
2875
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002876 // Try to bind memory to an image created with sparse memory flags
2877 {
2878 VkImageCreateInfo sparse_image_create_info = image_create_info;
2879 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2880 VkImageFormatProperties image_format_properties = {};
2881 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2882 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2883 sparse_image_create_info.usage, sparse_image_create_info.flags,
2884 &image_format_properties);
2885 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2886 // most likely means sparse formats aren't supported here; skip this test.
2887 } else {
2888 ASSERT_VK_SUCCESS(err);
2889 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002890 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002891 return;
2892 } else {
2893 VkImage sparse_image = VK_NULL_HANDLE;
2894 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2895 ASSERT_VK_SUCCESS(err);
2896 VkMemoryRequirements sparse_mem_reqs = {};
2897 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2898 if (sparse_mem_reqs.memoryTypeBits != 0) {
2899 VkMemoryAllocateInfo sparse_mem_alloc = {};
2900 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2901 sparse_mem_alloc.pNext = NULL;
2902 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2903 sparse_mem_alloc.memoryTypeIndex = 0;
2904 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2905 ASSERT_TRUE(pass);
2906 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2907 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2908 ASSERT_VK_SUCCESS(err);
2909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2910 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2911 // This may very well return an error.
2912 (void)err;
2913 m_errorMonitor->VerifyFound();
2914 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2915 }
2916 vkDestroyImage(m_device->device(), sparse_image, NULL);
2917 }
2918 }
2919 }
2920
2921 // Try to bind memory to a buffer created with sparse memory flags
2922 {
2923 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2924 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2925 if (!m_device->phy().features().sparseResidencyBuffer) {
2926 // most likely means sparse formats aren't supported here; skip this test.
2927 } else {
2928 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2929 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2930 ASSERT_VK_SUCCESS(err);
2931 VkMemoryRequirements sparse_mem_reqs = {};
2932 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2933 if (sparse_mem_reqs.memoryTypeBits != 0) {
2934 VkMemoryAllocateInfo sparse_mem_alloc = {};
2935 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2936 sparse_mem_alloc.pNext = NULL;
2937 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2938 sparse_mem_alloc.memoryTypeIndex = 0;
2939 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2940 ASSERT_TRUE(pass);
2941 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2942 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2943 ASSERT_VK_SUCCESS(err);
2944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2945 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2946 // This may very well return an error.
2947 (void)err;
2948 m_errorMonitor->VerifyFound();
2949 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2950 }
2951 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2952 }
2953 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002954}
2955
Karl Schultz6addd812016-02-02 17:17:23 -07002956TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2957 VkResult err;
2958 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002959
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002961
Tony Barbour1fa09702017-03-16 12:09:08 -06002962 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Karl Schultz6addd812016-02-02 17:17:23 -07002964 // Create an image object, allocate memory, destroy the object and then try
2965 // to bind it
2966 VkImage image;
2967 VkDeviceMemory mem;
2968 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002969
Karl Schultz6addd812016-02-02 17:17:23 -07002970 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2971 const int32_t tex_width = 32;
2972 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002973
2974 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002975 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2976 image_create_info.pNext = NULL;
2977 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2978 image_create_info.format = tex_format;
2979 image_create_info.extent.width = tex_width;
2980 image_create_info.extent.height = tex_height;
2981 image_create_info.extent.depth = 1;
2982 image_create_info.mipLevels = 1;
2983 image_create_info.arrayLayers = 1;
2984 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2985 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2986 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2987 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002988
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002989 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002990 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2991 mem_alloc.pNext = NULL;
2992 mem_alloc.allocationSize = 0;
2993 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002994
Chia-I Wuf7458c52015-10-26 21:10:41 +08002995 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002996 ASSERT_VK_SUCCESS(err);
2997
Karl Schultz6addd812016-02-02 17:17:23 -07002998 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002999
3000 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003001 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003002 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003003
3004 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003005 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003006 ASSERT_VK_SUCCESS(err);
3007
3008 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003009 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003010 ASSERT_VK_SUCCESS(err);
3011
3012 // Now Try to bind memory to this destroyed object
3013 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3014 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003015 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003016
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003017 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003018
Chia-I Wuf7458c52015-10-26 21:10:41 +08003019 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003020}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003021
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003022TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3023 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3024
Tony Barbour1fa09702017-03-16 12:09:08 -06003025 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3027
3028 VkVertexInputBindingDescription input_binding;
3029 memset(&input_binding, 0, sizeof(input_binding));
3030
3031 VkVertexInputAttributeDescription input_attribs;
3032 memset(&input_attribs, 0, sizeof(input_attribs));
3033
3034 // Pick a really bad format for this purpose and make sure it should fail
3035 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3036 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3037 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003038 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003039 return;
3040 }
3041
3042 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003043 char const *vsSource =
3044 "#version 450\n"
3045 "\n"
3046 "out gl_PerVertex {\n"
3047 " vec4 gl_Position;\n"
3048 "};\n"
3049 "void main(){\n"
3050 " gl_Position = vec4(1);\n"
3051 "}\n";
3052 char const *fsSource =
3053 "#version 450\n"
3054 "\n"
3055 "layout(location=0) out vec4 color;\n"
3056 "void main(){\n"
3057 " color = vec4(1);\n"
3058 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003059
3060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3061 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3062 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3063
3064 VkPipelineObj pipe(m_device);
3065 pipe.AddColorAttachment();
3066 pipe.AddShader(&vs);
3067 pipe.AddShader(&fs);
3068
3069 pipe.AddVertexInputBindings(&input_binding, 1);
3070 pipe.AddVertexInputAttribs(&input_attribs, 1);
3071
3072 VkDescriptorSetObj descriptorSet(m_device);
3073 descriptorSet.AppendDummy();
3074 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3075
3076 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3077
3078 m_errorMonitor->VerifyFound();
3079}
3080
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003081TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003082 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003083 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003084
3085 VkMemoryPropertyFlags reqs = 0;
3086 VkImageCreateInfo image_create_info = {};
3087 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3088 image_create_info.pNext = NULL;
3089 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3090 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3091 image_create_info.extent.width = 256;
3092 image_create_info.extent.height = 256;
3093 image_create_info.extent.depth = 1;
3094 image_create_info.mipLevels = 1;
3095 image_create_info.arrayLayers = 1;
3096 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3097 image_create_info.flags = 0;
3098
3099 VkImageBlit blit_region = {};
3100 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3101 blit_region.srcSubresource.baseArrayLayer = 0;
3102 blit_region.srcSubresource.layerCount = 1;
3103 blit_region.srcSubresource.mipLevel = 0;
3104 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3105 blit_region.dstSubresource.baseArrayLayer = 0;
3106 blit_region.dstSubresource.layerCount = 1;
3107 blit_region.dstSubresource.mipLevel = 0;
3108
3109 // Create two images, the source with sampleCount = 2, and attempt to blit
3110 // between them
3111 {
3112 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003115 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003117 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003118 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003119 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003121 m_errorMonitor->SetDesiredFailureMsg(
3122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3123 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003124 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3125 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003126 m_errorMonitor->VerifyFound();
3127 m_commandBuffer->EndCommandBuffer();
3128 }
3129
3130 // Create two images, the dest with sampleCount = 4, and attempt to blit
3131 // between them
3132 {
3133 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003134 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003135 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003136 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003137 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003138 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003139 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003140 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003141 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003142 m_errorMonitor->SetDesiredFailureMsg(
3143 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3144 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003145 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3146 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003147 m_errorMonitor->VerifyFound();
3148 m_commandBuffer->EndCommandBuffer();
3149 }
3150
3151 VkBufferImageCopy copy_region = {};
3152 copy_region.bufferRowLength = 128;
3153 copy_region.bufferImageHeight = 128;
3154 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3155 copy_region.imageSubresource.layerCount = 1;
3156 copy_region.imageExtent.height = 64;
3157 copy_region.imageExtent.width = 64;
3158 copy_region.imageExtent.depth = 1;
3159
3160 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3161 // buffer to image
3162 {
3163 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003164 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3165 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003166 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003168 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003169 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003170 m_errorMonitor->SetDesiredFailureMsg(
3171 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3172 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003173 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3174 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003175 m_errorMonitor->VerifyFound();
3176 m_commandBuffer->EndCommandBuffer();
3177 }
3178
3179 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3180 // image to buffer
3181 {
3182 vk_testing::Buffer dst_buffer;
3183 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3184 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003185 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003186 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003187 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003188 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003189 m_errorMonitor->SetDesiredFailureMsg(
3190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3191 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003192 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003193 dst_buffer.handle(), 1, &copy_region);
3194 m_errorMonitor->VerifyFound();
3195 m_commandBuffer->EndCommandBuffer();
3196 }
3197}
3198
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003199TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003200 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003201
3202 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003203 src_image.Init(64, 64, 1, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003204 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003205 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003206 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003207 dst_image2.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003208
3209 VkImageBlit blitRegion = {};
3210 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3211 blitRegion.srcSubresource.baseArrayLayer = 0;
3212 blitRegion.srcSubresource.layerCount = 1;
3213 blitRegion.srcSubresource.mipLevel = 0;
3214 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3215 blitRegion.dstSubresource.baseArrayLayer = 0;
3216 blitRegion.dstSubresource.layerCount = 1;
3217 blitRegion.dstSubresource.mipLevel = 0;
3218
Dave Houlton34df4cb2016-12-01 16:43:06 -07003219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3220
3221 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3222 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003223
3224 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003225 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003226 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003227 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003228
3229 m_errorMonitor->VerifyFound();
3230
Dave Houlton34df4cb2016-12-01 16:43:06 -07003231 // Test should generate 2 VU failures
3232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003234
3235 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003236 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003237 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003238
Dave Houlton34df4cb2016-12-01 16:43:06 -07003239 // TODO: Note that this only verifies that at least one of the VU enums was found
3240 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003241 m_errorMonitor->VerifyFound();
3242
Tony Barbour552f6c02016-12-21 14:34:07 -07003243 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003244}
3245
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003246TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3247 VkResult err;
3248 bool pass;
3249
3250 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003251 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003252
3253 // If w/d/h granularity is 1, test is not meaningful
3254 // TODO: When virtual device limits are available, create a set of limits for this test that
3255 // will always have a granularity of > 1 for w, h, and d
3256 auto index = m_device->graphics_queue_node_index_;
3257 auto queue_family_properties = m_device->phy().queue_properties();
3258
3259 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3260 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3261 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3262 return;
3263 }
3264
3265 // Create two images of different types and try to copy between them
3266 VkImage srcImage;
3267 VkImage dstImage;
3268 VkDeviceMemory srcMem;
3269 VkDeviceMemory destMem;
3270 VkMemoryRequirements memReqs;
3271
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003272 VkImageCreateInfo image_create_info = {};
3273 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3274 image_create_info.pNext = NULL;
3275 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3276 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3277 image_create_info.extent.width = 32;
3278 image_create_info.extent.height = 32;
3279 image_create_info.extent.depth = 1;
3280 image_create_info.mipLevels = 1;
3281 image_create_info.arrayLayers = 4;
3282 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3283 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3284 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3285 image_create_info.flags = 0;
3286
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003287 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003288 ASSERT_VK_SUCCESS(err);
3289
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003290 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003291 ASSERT_VK_SUCCESS(err);
3292
3293 // Allocate memory
3294 VkMemoryAllocateInfo memAlloc = {};
3295 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3296 memAlloc.pNext = NULL;
3297 memAlloc.allocationSize = 0;
3298 memAlloc.memoryTypeIndex = 0;
3299
3300 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3301 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003302 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003303 ASSERT_TRUE(pass);
3304 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3305 ASSERT_VK_SUCCESS(err);
3306
3307 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3308 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003309 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003310 ASSERT_VK_SUCCESS(err);
3311 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3312 ASSERT_VK_SUCCESS(err);
3313
3314 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3315 ASSERT_VK_SUCCESS(err);
3316 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3317 ASSERT_VK_SUCCESS(err);
3318
Tony Barbour552f6c02016-12-21 14:34:07 -07003319 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003320 VkImageCopy copyRegion;
3321 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3322 copyRegion.srcSubresource.mipLevel = 0;
3323 copyRegion.srcSubresource.baseArrayLayer = 0;
3324 copyRegion.srcSubresource.layerCount = 1;
3325 copyRegion.srcOffset.x = 0;
3326 copyRegion.srcOffset.y = 0;
3327 copyRegion.srcOffset.z = 0;
3328 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3329 copyRegion.dstSubresource.mipLevel = 0;
3330 copyRegion.dstSubresource.baseArrayLayer = 0;
3331 copyRegion.dstSubresource.layerCount = 1;
3332 copyRegion.dstOffset.x = 0;
3333 copyRegion.dstOffset.y = 0;
3334 copyRegion.dstOffset.z = 0;
3335 copyRegion.extent.width = 1;
3336 copyRegion.extent.height = 1;
3337 copyRegion.extent.depth = 1;
3338
3339 // Introduce failure by setting srcOffset to a bad granularity value
3340 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3342 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003343 m_errorMonitor->VerifyFound();
3344
3345 // Introduce failure by setting extent to a bad granularity value
3346 copyRegion.srcOffset.y = 0;
3347 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3349 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003350 m_errorMonitor->VerifyFound();
3351
3352 // Now do some buffer/image copies
3353 vk_testing::Buffer buffer;
3354 VkMemoryPropertyFlags reqs = 0;
3355 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3356 VkBufferImageCopy region = {};
3357 region.bufferOffset = 0;
3358 region.bufferRowLength = 3;
3359 region.bufferImageHeight = 128;
3360 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3361 region.imageSubresource.layerCount = 1;
3362 region.imageExtent.height = 16;
3363 region.imageExtent.width = 16;
3364 region.imageExtent.depth = 1;
3365 region.imageOffset.x = 0;
3366 region.imageOffset.y = 0;
3367 region.imageOffset.z = 0;
3368
3369 // Introduce failure by setting bufferRowLength to a bad granularity value
3370 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3372 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3373 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003374 m_errorMonitor->VerifyFound();
3375 region.bufferRowLength = 128;
3376
3377 // Introduce failure by setting bufferOffset to a bad granularity value
3378 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3380 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3381 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003382 m_errorMonitor->VerifyFound();
3383 region.bufferOffset = 0;
3384
3385 // Introduce failure by setting bufferImageHeight to a bad granularity value
3386 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3389 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003390 m_errorMonitor->VerifyFound();
3391 region.bufferImageHeight = 128;
3392
3393 // Introduce failure by setting imageExtent to a bad granularity value
3394 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3396 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3397 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003398 m_errorMonitor->VerifyFound();
3399 region.imageExtent.width = 16;
3400
3401 // Introduce failure by setting imageOffset to a bad granularity value
3402 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3404 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3405 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003406 m_errorMonitor->VerifyFound();
3407
Tony Barbour552f6c02016-12-21 14:34:07 -07003408 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003409
3410 vkDestroyImage(m_device->device(), srcImage, NULL);
3411 vkDestroyImage(m_device->device(), dstImage, NULL);
3412 vkFreeMemory(m_device->device(), srcMem, NULL);
3413 vkFreeMemory(m_device->device(), destMem, NULL);
3414}
3415
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003416TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003417 TEST_DESCRIPTION(
3418 "Submit command buffer created using one queue family and "
3419 "attempt to submit them on a queue created in a different "
3420 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003421
Tony Barbour1fa09702017-03-16 12:09:08 -06003422 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003423
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003424 // This test is meaningless unless we have multiple queue families
3425 auto queue_family_properties = m_device->phy().queue_properties();
3426 if (queue_family_properties.size() < 2) {
3427 return;
3428 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003430 // Get safe index of another queue family
3431 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003432 VkQueue other_queue;
3433 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3434
3435 // Record an empty cmd buffer
3436 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3437 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3438 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3439 vkEndCommandBuffer(m_commandBuffer->handle());
3440
3441 // And submit on the wrong queue
3442 VkSubmitInfo submit_info = {};
3443 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3444 submit_info.commandBufferCount = 1;
3445 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003446 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003447
3448 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003449}
3450
Chris Forbes4c24a922016-11-16 08:59:10 +13003451TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003453
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003454 // There are no attachments, but refer to attachment 0.
3455 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003456 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003457 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003458 };
3459
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003460 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003461 VkRenderPass rp;
3462
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003463 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003465 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3466 m_errorMonitor->VerifyFound();
3467}
3468
Chris Forbesa58c4522016-09-28 15:19:39 +13003469TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3470 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003471 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003472
3473 // A renderpass with two subpasses, both writing the same attachment.
3474 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003475 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3476 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3477 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003478 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003479 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003480 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003481 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3482 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003483 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003484 VkSubpassDependency dep = {0,
3485 1,
3486 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3487 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3488 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3489 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3490 VK_DEPENDENCY_BY_REGION_BIT};
3491 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003492 VkRenderPass rp;
3493 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3494 ASSERT_VK_SUCCESS(err);
3495
3496 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003497 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003498 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3499
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003500 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003501 VkFramebuffer fb;
3502 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3503 ASSERT_VK_SUCCESS(err);
3504
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003505 char const *vsSource =
3506 "#version 450\n"
3507 "void main() { gl_Position = vec4(1); }\n";
3508 char const *fsSource =
3509 "#version 450\n"
3510 "layout(location=0) out vec4 color;\n"
3511 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003512
3513 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3514 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3515 VkPipelineObj pipe(m_device);
3516 pipe.AddColorAttachment();
3517 pipe.AddShader(&vs);
3518 pipe.AddShader(&fs);
3519 VkViewport view_port = {};
3520 m_viewports.push_back(view_port);
3521 pipe.SetViewport(m_viewports);
3522 VkRect2D rect = {};
3523 m_scissors.push_back(rect);
3524 pipe.SetScissor(m_scissors);
3525
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003526 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003527 VkPipelineLayout pl;
3528 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3529 ASSERT_VK_SUCCESS(err);
3530 pipe.CreateVKPipeline(pl, rp);
3531
Tony Barbour552f6c02016-12-21 14:34:07 -07003532 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003533
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003534 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3535 nullptr,
3536 rp,
3537 fb,
3538 {{
3539 0, 0,
3540 },
3541 {32, 32}},
3542 0,
3543 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003544
3545 // subtest 1: bind in the wrong subpass
3546 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3547 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003549 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3550 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3551 m_errorMonitor->VerifyFound();
3552
3553 vkCmdEndRenderPass(m_commandBuffer->handle());
3554
3555 // subtest 2: bind in correct subpass, then transition to next subpass
3556 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3557 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3558 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003560 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3561 m_errorMonitor->VerifyFound();
3562
3563 vkCmdEndRenderPass(m_commandBuffer->handle());
3564
Tony Barbour552f6c02016-12-21 14:34:07 -07003565 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003566
3567 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3568 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3569 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3570}
3571
Tony Barbour4e919972016-08-09 13:27:40 -06003572TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 TEST_DESCRIPTION(
3574 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3575 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003576 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3578
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3580 "Cannot execute a render pass with renderArea "
3581 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003582
3583 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3584 m_renderPassBeginInfo.renderArea.extent.width = 257;
3585 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003586 m_commandBuffer->BeginCommandBuffer();
3587 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003588 m_errorMonitor->VerifyFound();
3589}
3590
3591TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003592 TEST_DESCRIPTION(
3593 "Generate INDEPENDENT_BLEND by disabling independent "
3594 "blend and then specifying different blend states for two "
3595 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003596 VkPhysicalDeviceFeatures features = {};
3597 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003598 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003599
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3601 "Invalid Pipeline CreateInfo: If independent blend feature not "
3602 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003603
Cody Northropc31a84f2016-08-22 10:41:47 -06003604 VkDescriptorSetObj descriptorSet(m_device);
3605 descriptorSet.AppendDummy();
3606 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003607
Cody Northropc31a84f2016-08-22 10:41:47 -06003608 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003609 // Create a renderPass with two color attachments
3610 VkAttachmentReference attachments[2] = {};
3611 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003612 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003613 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3614
3615 VkSubpassDescription subpass = {};
3616 subpass.pColorAttachments = attachments;
3617 subpass.colorAttachmentCount = 2;
3618
3619 VkRenderPassCreateInfo rpci = {};
3620 rpci.subpassCount = 1;
3621 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003622 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003623
Tony Barbourffd60bd2017-03-09 12:04:55 -07003624 VkAttachmentDescription attach_desc[2] = {};
3625 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3626 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3627 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3628 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3629 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3630 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3631 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3632 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003633
Tony Barbourffd60bd2017-03-09 12:04:55 -07003634 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003635 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3636
3637 VkRenderPass renderpass;
3638 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003639 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003640 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003641
Cody Northropc31a84f2016-08-22 10:41:47 -06003642 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3643 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3644 att_state1.blendEnable = VK_TRUE;
3645 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3646 att_state2.blendEnable = VK_FALSE;
3647 pipeline.AddColorAttachment(0, &att_state1);
3648 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003649 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003650 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003651 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003652}
3653
Mike Weiblen40b160e2017-02-06 19:21:52 -07003654// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3655TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3656 TEST_DESCRIPTION(
3657 "Create a graphics pipeline that is incompatible with the requirements "
3658 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003659 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003660
3661 VkDescriptorSetObj ds_obj(m_device);
3662 ds_obj.AppendDummy();
3663 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3664
3665 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3666
3667 VkPipelineColorBlendAttachmentState att_state1 = {};
3668 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3669 att_state1.blendEnable = VK_TRUE;
3670
3671 VkRenderpassObj rp_obj(m_device);
3672
3673 {
3674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3675 VkPipelineObj pipeline(m_device);
3676 pipeline.AddShader(&vs_obj);
3677 pipeline.AddColorAttachment(0, &att_state1);
3678
3679 VkGraphicsPipelineCreateInfo info = {};
3680 pipeline.InitGraphicsPipelineCreateInfo(&info);
3681 info.pColorBlendState = nullptr;
3682
3683 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3684 m_errorMonitor->VerifyFound();
3685 }
3686}
3687
Chris Forbes26ec2122016-11-29 08:58:33 +13003688#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003689TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3690 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3691 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003692 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003693
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3695 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003696
3697 // Create a renderPass with a single color attachment
3698 VkAttachmentReference attach = {};
3699 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3700 VkSubpassDescription subpass = {};
3701 VkRenderPassCreateInfo rpci = {};
3702 rpci.subpassCount = 1;
3703 rpci.pSubpasses = &subpass;
3704 rpci.attachmentCount = 1;
3705 VkAttachmentDescription attach_desc = {};
3706 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3707 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3708 rpci.pAttachments = &attach_desc;
3709 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3710 VkRenderPass rp;
3711 subpass.pDepthStencilAttachment = &attach;
3712 subpass.pColorAttachments = NULL;
3713 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3714 m_errorMonitor->VerifyFound();
3715}
Chris Forbes26ec2122016-11-29 08:58:33 +13003716#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003717
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003718TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003719 TEST_DESCRIPTION(
3720 "Create a framebuffer where a subpass has a preserve "
3721 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003722
Tony Barbour1fa09702017-03-16 12:09:08 -06003723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3725
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003727
3728 VkAttachmentReference color_attach = {};
3729 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3730 color_attach.attachment = 0;
3731 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3732 VkSubpassDescription subpass = {};
3733 subpass.colorAttachmentCount = 1;
3734 subpass.pColorAttachments = &color_attach;
3735 subpass.preserveAttachmentCount = 1;
3736 subpass.pPreserveAttachments = &preserve_attachment;
3737
3738 VkRenderPassCreateInfo rpci = {};
3739 rpci.subpassCount = 1;
3740 rpci.pSubpasses = &subpass;
3741 rpci.attachmentCount = 1;
3742 VkAttachmentDescription attach_desc = {};
3743 attach_desc.format = VK_FORMAT_UNDEFINED;
3744 rpci.pAttachments = &attach_desc;
3745 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3746 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003747 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003748
3749 m_errorMonitor->VerifyFound();
3750
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003751 if (result == VK_SUCCESS) {
3752 vkDestroyRenderPass(m_device->device(), rp, NULL);
3753 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003754}
3755
Chris Forbesc5389742016-06-29 11:49:23 +12003756TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003757 TEST_DESCRIPTION(
3758 "Ensure that CreateRenderPass produces a validation error "
3759 "when the source of a subpass multisample resolve "
3760 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003761
Tony Barbour1fa09702017-03-16 12:09:08 -06003762 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003763
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3765 "Subpass 0 requests multisample resolve from attachment 0 which has "
3766 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003767
3768 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003769 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3770 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3771 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3772 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3773 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3774 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003775 };
3776
3777 VkAttachmentReference color = {
3778 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3779 };
3780
3781 VkAttachmentReference resolve = {
3782 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3783 };
3784
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003785 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003787 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003788
3789 VkRenderPass rp;
3790 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3791
3792 m_errorMonitor->VerifyFound();
3793
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003794 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003795}
3796
3797TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003798 TEST_DESCRIPTION(
3799 "Ensure CreateRenderPass produces a validation error "
3800 "when a subpass multisample resolve operation is "
3801 "requested, and the destination of that resolve has "
3802 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003803
Tony Barbour1fa09702017-03-16 12:09:08 -06003804 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003805
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3807 "Subpass 0 requests multisample resolve into attachment 1, which "
3808 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003809
3810 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003811 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3812 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3813 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3814 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3815 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3816 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003817 };
3818
3819 VkAttachmentReference color = {
3820 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3821 };
3822
3823 VkAttachmentReference resolve = {
3824 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3825 };
3826
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003827 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003828
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003829 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003830
3831 VkRenderPass rp;
3832 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3833
3834 m_errorMonitor->VerifyFound();
3835
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003836 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003837}
3838
Chris Forbes3f128ef2016-06-29 14:58:53 +12003839TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003840 TEST_DESCRIPTION(
3841 "Ensure CreateRenderPass produces a validation error "
3842 "when the color and depth attachments used by a subpass "
3843 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003844
Tony Barbour1fa09702017-03-16 12:09:08 -06003845 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003846
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3848 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003849
3850 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003851 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3852 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3853 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3854 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3855 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3856 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003857 };
3858
3859 VkAttachmentReference color[] = {
3860 {
3861 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3862 },
3863 {
3864 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3865 },
3866 };
3867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003868 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003869
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003870 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003871
3872 VkRenderPass rp;
3873 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3874
3875 m_errorMonitor->VerifyFound();
3876
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003877 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003878}
3879
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003880TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003881 TEST_DESCRIPTION(
3882 "Hit errors when attempting to create a framebuffer :\n"
3883 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3884 " 2. Use a color image as depthStencil attachment\n"
3885 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3886 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3887 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3888 " 6. Framebuffer attachment where dimensions don't match\n"
Cort Stratton8133ec22017-04-27 16:25:03 +02003889 " 7. Framebuffer attachment where dimensions don't match\n"
3890 " 8. Framebuffer attachment w/o identity swizzle\n"
3891 " 9. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892
Tony Barbour1fa09702017-03-16 12:09:08 -06003893 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003894 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3895
Cort Stratton8133ec22017-04-27 16:25:03 +02003896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00404);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003897
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003898 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003899 VkAttachmentReference attach = {};
3900 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3901 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003902 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003903 VkRenderPassCreateInfo rpci = {};
3904 rpci.subpassCount = 1;
3905 rpci.pSubpasses = &subpass;
3906 rpci.attachmentCount = 1;
3907 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003908 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003909 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003910 rpci.pAttachments = &attach_desc;
3911 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3912 VkRenderPass rp;
3913 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3914 ASSERT_VK_SUCCESS(err);
3915
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003916 VkImageView ivs[2];
3917 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3918 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003919 VkFramebufferCreateInfo fb_info = {};
3920 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3921 fb_info.pNext = NULL;
3922 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003923 // Set mis-matching attachmentCount
3924 fb_info.attachmentCount = 2;
3925 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003926 fb_info.width = 100;
3927 fb_info.height = 100;
3928 fb_info.layers = 1;
3929
3930 VkFramebuffer fb;
3931 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3932
3933 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003934 if (err == VK_SUCCESS) {
3935 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3936 }
3937 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003938
3939 // Create a renderPass with a depth-stencil attachment created with
3940 // IMAGE_USAGE_COLOR_ATTACHMENT
3941 // Add our color attachment to pDepthStencilAttachment
3942 subpass.pDepthStencilAttachment = &attach;
3943 subpass.pColorAttachments = NULL;
3944 VkRenderPass rp_ds;
3945 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3946 ASSERT_VK_SUCCESS(err);
3947 // Set correct attachment count, but attachment has COLOR usage bit set
3948 fb_info.attachmentCount = 1;
3949 fb_info.renderPass = rp_ds;
3950
Cort Stratton8133ec22017-04-27 16:25:03 +02003951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00406);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003952 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3953
3954 m_errorMonitor->VerifyFound();
3955 if (err == VK_SUCCESS) {
3956 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3957 }
3958 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003959
3960 // Create new renderpass with alternate attachment format from fb
3961 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3962 subpass.pDepthStencilAttachment = NULL;
3963 subpass.pColorAttachments = &attach;
3964 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3965 ASSERT_VK_SUCCESS(err);
3966
3967 // Cause error due to mis-matched formats between rp & fb
3968 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3969 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00408);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003971 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3972
3973 m_errorMonitor->VerifyFound();
3974 if (err == VK_SUCCESS) {
3975 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3976 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003977 vkDestroyRenderPass(m_device->device(), rp, NULL);
3978
3979 // Create new renderpass with alternate sample count from fb
3980 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3981 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3982 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3983 ASSERT_VK_SUCCESS(err);
3984
3985 // Cause error due to mis-matched sample count between rp & fb
3986 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00409);
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003988 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3989
3990 m_errorMonitor->VerifyFound();
3991 if (err == VK_SUCCESS) {
3992 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3993 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003994
3995 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003996
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003997 {
3998 // Create an image with 2 mip levels.
3999 VkImageObj image(m_device);
4000 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4001 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004002
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004003 // Create a image view with two mip levels.
4004 VkImageView view;
4005 VkImageViewCreateInfo ivci = {};
4006 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4007 ivci.image = image.handle();
4008 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4009 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4010 ivci.subresourceRange.layerCount = 1;
4011 ivci.subresourceRange.baseMipLevel = 0;
4012 // Set level count to 2 (only 1 is allowed for FB attachment)
4013 ivci.subresourceRange.levelCount = 2;
4014 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4015 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4016 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004017
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004018 // Re-create renderpass to have matching sample count
4019 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4020 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4021 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004022
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004023 fb_info.renderPass = rp;
4024 fb_info.pAttachments = &view;
Cort Stratton8133ec22017-04-27 16:25:03 +02004025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00411);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004026 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4027
4028 m_errorMonitor->VerifyFound();
4029 if (err == VK_SUCCESS) {
4030 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4031 }
4032 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004033 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004034
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004035 // Update view to original color buffer and grow FB dimensions too big
4036 fb_info.pAttachments = ivs;
4037 fb_info.height = 1024;
4038 fb_info.width = 1024;
4039 fb_info.layers = 2;
Cort Stratton8133ec22017-04-27 16:25:03 +02004040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004041 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4042
4043 m_errorMonitor->VerifyFound();
4044 if (err == VK_SUCCESS) {
4045 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4046 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004047
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004048 {
4049 // Create an image with one mip level.
4050 VkImageObj image(m_device);
4051 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4052 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004053
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004054 // Create view attachment with non-identity swizzle
4055 VkImageView view;
4056 VkImageViewCreateInfo ivci = {};
4057 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4058 ivci.image = image.handle();
4059 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4060 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4061 ivci.subresourceRange.layerCount = 1;
4062 ivci.subresourceRange.baseMipLevel = 0;
4063 ivci.subresourceRange.levelCount = 1;
4064 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4065 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4066 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4067 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4068 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4069 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4070 ASSERT_VK_SUCCESS(err);
4071
4072 fb_info.pAttachments = &view;
4073 fb_info.height = 100;
4074 fb_info.width = 100;
4075 fb_info.layers = 1;
4076
Cort Stratton8133ec22017-04-27 16:25:03 +02004077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00412);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004078 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4079
4080 m_errorMonitor->VerifyFound();
4081 if (err == VK_SUCCESS) {
4082 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4083 }
4084 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004085 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004086
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004087 // reset attachment to color attachment
4088 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004089
4090 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004091 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004092 fb_info.height = 100;
4093 fb_info.layers = 1;
4094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Cort Stratton8133ec22017-04-27 16:25:03 +02004095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004096 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004097 m_errorMonitor->VerifyFound();
4098 if (err == VK_SUCCESS) {
4099 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4100 }
4101 // and width=0
4102 fb_info.width = 0;
4103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02806);
4104 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004105 m_errorMonitor->VerifyFound();
4106 if (err == VK_SUCCESS) {
4107 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4108 }
4109
4110 // Request fb that exceeds max height
4111 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004112 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004113 fb_info.layers = 1;
4114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Cort Stratton8133ec22017-04-27 16:25:03 +02004115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004116 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004117 m_errorMonitor->VerifyFound();
4118 if (err == VK_SUCCESS) {
4119 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4120 }
4121 // and height=0
4122 fb_info.height = 0;
4123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02807);
4124 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004125 m_errorMonitor->VerifyFound();
4126 if (err == VK_SUCCESS) {
4127 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4128 }
4129
4130 // Request fb that exceeds max layers
4131 fb_info.width = 100;
4132 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004133 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Cort Stratton8133ec22017-04-27 16:25:03 +02004135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004136 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004137 m_errorMonitor->VerifyFound();
4138 if (err == VK_SUCCESS) {
4139 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4140 }
4141 // and layers=0
4142 fb_info.layers = 0;
4143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02808);
4144 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004145 m_errorMonitor->VerifyFound();
4146 if (err == VK_SUCCESS) {
4147 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4148 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004149
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004150 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004151}
4152
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004153TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004154 TEST_DESCRIPTION(
4155 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4156 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004157
Tony Barbour1fa09702017-03-16 12:09:08 -06004158 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4161 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004162 m_errorMonitor->VerifyFound();
4163}
4164
4165TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004166 TEST_DESCRIPTION(
4167 "Run a simple draw calls to validate failure when Line Width dynamic "
4168 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004169
Tony Barbour1fa09702017-03-16 12:09:08 -06004170 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004171 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4173 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004174 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004175}
4176
4177TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004178 TEST_DESCRIPTION(
4179 "Run a simple draw calls to validate failure when Viewport dynamic "
4180 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004181
Tony Barbour1fa09702017-03-16 12:09:08 -06004182 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004183 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4185 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004186 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004187 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004188}
4189
4190TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004191 TEST_DESCRIPTION(
4192 "Run a simple draw calls to validate failure when Scissor dynamic "
4193 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004194
Tony Barbour1fa09702017-03-16 12:09:08 -06004195 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004196 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4198 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004199 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004200 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004201}
4202
Cortd713fe82016-07-27 09:51:27 -07004203TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004204 TEST_DESCRIPTION(
4205 "Run a simple draw calls to validate failure when Blend Constants "
4206 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004207
Tony Barbour1fa09702017-03-16 12:09:08 -06004208 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004209 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4211 "Dynamic blend constants state not set for this command buffer");
4212 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004213 m_errorMonitor->VerifyFound();
4214}
4215
4216TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004217 TEST_DESCRIPTION(
4218 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4219 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004220
Tony Barbour1fa09702017-03-16 12:09:08 -06004221 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004222 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004223 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004224 return;
4225 }
4226 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4228 "Dynamic depth bounds state not set for this command buffer");
4229 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004230 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004231}
4232
4233TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004234 TEST_DESCRIPTION(
4235 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4236 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004237
Tony Barbour1fa09702017-03-16 12:09:08 -06004238 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004239 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4241 "Dynamic stencil read mask state not set for this command buffer");
4242 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004243 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004244}
4245
4246TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004247 TEST_DESCRIPTION(
4248 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4249 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004250
Tony Barbour1fa09702017-03-16 12:09:08 -06004251 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004252 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4254 "Dynamic stencil write mask state not set for this command buffer");
4255 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004256 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004257}
4258
4259TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004260 TEST_DESCRIPTION(
4261 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4262 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004263
Tony Barbour1fa09702017-03-16 12:09:08 -06004264 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004265 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4267 "Dynamic stencil reference state not set for this command buffer");
4268 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004269 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004270}
4271
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004272TEST_F(VkLayerTest, IndexBufferNotBound) {
4273 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004274
Tony Barbour1fa09702017-03-16 12:09:08 -06004275 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4277 "Index buffer object not bound to this command buffer when Indexed ");
4278 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004279 m_errorMonitor->VerifyFound();
4280}
4281
Karl Schultz6addd812016-02-02 17:17:23 -07004282TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4284 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4285 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004286
Tony Barbour1fa09702017-03-16 12:09:08 -06004287 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004288 ASSERT_NO_FATAL_FAILURE(InitViewport());
4289 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4290
Karl Schultz6addd812016-02-02 17:17:23 -07004291 // We luck out b/c by default the framework creates CB w/ the
4292 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004293 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004294 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004295 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004296
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004297 // Bypass framework since it does the waits automatically
4298 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004299 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004300 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4301 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004302 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004303 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004304 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004305 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004306 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004307 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004308 submit_info.pSignalSemaphores = NULL;
4309
Chris Forbes40028e22016-06-13 09:59:34 +12004310 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004311 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004312 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004313
Karl Schultz6addd812016-02-02 17:17:23 -07004314 // Cause validation error by re-submitting cmd buffer that should only be
4315 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004316 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004317 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004318
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004319 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004320}
4321
Karl Schultz6addd812016-02-02 17:17:23 -07004322TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004323 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004324 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004325
Tony Barbour1fa09702017-03-16 12:09:08 -06004326 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004328
Karl Schultz6addd812016-02-02 17:17:23 -07004329 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4330 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004331 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004332 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004333 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004334
4335 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004336 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4337 ds_pool_ci.pNext = NULL;
4338 ds_pool_ci.flags = 0;
4339 ds_pool_ci.maxSets = 1;
4340 ds_pool_ci.poolSizeCount = 1;
4341 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
4343 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004344 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345 ASSERT_VK_SUCCESS(err);
4346
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004347 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4348 dsl_binding_samp.binding = 0;
4349 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4350 dsl_binding_samp.descriptorCount = 1;
4351 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4352 dsl_binding_samp.pImmutableSamplers = NULL;
4353
4354 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4355 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4356 ds_layout_ci.pNext = NULL;
4357 ds_layout_ci.bindingCount = 1;
4358 ds_layout_ci.pBindings = &dsl_binding_samp;
4359
4360 VkDescriptorSetLayout ds_layout_samp;
4361 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4362 ASSERT_VK_SUCCESS(err);
4363
4364 // Try to allocate 2 sets when pool only has 1 set
4365 VkDescriptorSet descriptor_sets[2];
4366 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4367 VkDescriptorSetAllocateInfo alloc_info = {};
4368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4369 alloc_info.descriptorSetCount = 2;
4370 alloc_info.descriptorPool = ds_pool;
4371 alloc_info.pSetLayouts = set_layouts;
4372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4373 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4374 m_errorMonitor->VerifyFound();
4375
4376 alloc_info.descriptorSetCount = 1;
4377 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004378 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004379 dsl_binding.binding = 0;
4380 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4381 dsl_binding.descriptorCount = 1;
4382 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4383 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004384
Karl Schultz6addd812016-02-02 17:17:23 -07004385 ds_layout_ci.bindingCount = 1;
4386 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004387
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004388 VkDescriptorSetLayout ds_layout_ub;
4389 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004390 ASSERT_VK_SUCCESS(err);
4391
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004392 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004393 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004394 alloc_info.pSetLayouts = &ds_layout_ub;
4395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4396 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004397
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004398 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004399
Karl Schultz2825ab92016-12-02 08:23:14 -07004400 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004401 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004402 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004403}
4404
Karl Schultz6addd812016-02-02 17:17:23 -07004405TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4406 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004407
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004409
Tony Barbour1fa09702017-03-16 12:09:08 -06004410 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004412
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004413 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004414 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4415 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004416
4417 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004418 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4419 ds_pool_ci.pNext = NULL;
4420 ds_pool_ci.maxSets = 1;
4421 ds_pool_ci.poolSizeCount = 1;
4422 ds_pool_ci.flags = 0;
4423 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4424 // app can only call vkResetDescriptorPool on this pool.;
4425 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004426
4427 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004428 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004429 ASSERT_VK_SUCCESS(err);
4430
4431 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004432 dsl_binding.binding = 0;
4433 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4434 dsl_binding.descriptorCount = 1;
4435 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4436 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004437
4438 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004439 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4440 ds_layout_ci.pNext = NULL;
4441 ds_layout_ci.bindingCount = 1;
4442 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004443
4444 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004445 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004446 ASSERT_VK_SUCCESS(err);
4447
4448 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004449 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004450 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004451 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004452 alloc_info.descriptorPool = ds_pool;
4453 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004454 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004455 ASSERT_VK_SUCCESS(err);
4456
4457 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004458 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004459
Chia-I Wuf7458c52015-10-26 21:10:41 +08004460 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4461 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004462}
4463
Karl Schultz6addd812016-02-02 17:17:23 -07004464TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004465 // Attempt to clear Descriptor Pool with bad object.
4466 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004467
Tony Barbour1fa09702017-03-16 12:09:08 -06004468 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004470 uint64_t fake_pool_handle = 0xbaad6001;
4471 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4472 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004473 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004474}
4475
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004476TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4478 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004480 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004481
4482 uint64_t fake_set_handle = 0xbaad6001;
4483 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004484 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004485 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004486
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488
4489 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4490 layout_bindings[0].binding = 0;
4491 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4492 layout_bindings[0].descriptorCount = 1;
4493 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4494 layout_bindings[0].pImmutableSamplers = NULL;
4495
4496 VkDescriptorSetLayout descriptor_set_layout;
4497 VkDescriptorSetLayoutCreateInfo dslci = {};
4498 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4499 dslci.pNext = NULL;
4500 dslci.bindingCount = 1;
4501 dslci.pBindings = layout_bindings;
4502 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004503 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004504
4505 VkPipelineLayout pipeline_layout;
4506 VkPipelineLayoutCreateInfo plci = {};
4507 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4508 plci.pNext = NULL;
4509 plci.setLayoutCount = 1;
4510 plci.pSetLayouts = &descriptor_set_layout;
4511 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004512 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004513
Tony Barbour552f6c02016-12-21 14:34:07 -07004514 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004515 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4516 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004517 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004518 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004519 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4520 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004521}
4522
Karl Schultz6addd812016-02-02 17:17:23 -07004523TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004524 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4525 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004526 uint64_t fake_layout_handle = 0xbaad6001;
4527 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004529 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004530 VkPipelineLayout pipeline_layout;
4531 VkPipelineLayoutCreateInfo plci = {};
4532 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4533 plci.pNext = NULL;
4534 plci.setLayoutCount = 1;
4535 plci.pSetLayouts = &bad_layout;
4536 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4537
4538 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004539}
4540
Mark Muellerd4914412016-06-13 17:52:06 -06004541TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004542 TEST_DESCRIPTION(
4543 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4544 "1) A uniform buffer update must have a valid buffer index."
4545 "2) When using an array of descriptors in a single WriteDescriptor,"
4546 " the descriptor types and stageflags must all be the same."
4547 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004548
Mike Weiblena6666382017-01-05 15:16:11 -07004549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004550
Tony Barbour1fa09702017-03-16 12:09:08 -06004551 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004552 VkDescriptorPoolSize ds_type_count[4] = {};
4553 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4554 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004555 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004556 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004557 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004558 ds_type_count[2].descriptorCount = 1;
4559 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4560 ds_type_count[3].descriptorCount = 1;
4561
4562 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4563 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4564 ds_pool_ci.maxSets = 1;
4565 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4566 ds_pool_ci.pPoolSizes = ds_type_count;
4567
4568 VkDescriptorPool ds_pool;
4569 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4570 ASSERT_VK_SUCCESS(err);
4571
Mark Muellerb9896722016-06-16 09:54:29 -06004572 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004573 layout_binding[0].binding = 0;
4574 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4575 layout_binding[0].descriptorCount = 1;
4576 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4577 layout_binding[0].pImmutableSamplers = NULL;
4578
4579 layout_binding[1].binding = 1;
4580 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4581 layout_binding[1].descriptorCount = 1;
4582 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4583 layout_binding[1].pImmutableSamplers = NULL;
4584
4585 VkSamplerCreateInfo sampler_ci = {};
4586 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4587 sampler_ci.pNext = NULL;
4588 sampler_ci.magFilter = VK_FILTER_NEAREST;
4589 sampler_ci.minFilter = VK_FILTER_NEAREST;
4590 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4591 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4592 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4593 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4594 sampler_ci.mipLodBias = 1.0;
4595 sampler_ci.anisotropyEnable = VK_FALSE;
4596 sampler_ci.maxAnisotropy = 1;
4597 sampler_ci.compareEnable = VK_FALSE;
4598 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4599 sampler_ci.minLod = 1.0;
4600 sampler_ci.maxLod = 1.0;
4601 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4602 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4603 VkSampler sampler;
4604
4605 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4606 ASSERT_VK_SUCCESS(err);
4607
4608 layout_binding[2].binding = 2;
4609 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4610 layout_binding[2].descriptorCount = 1;
4611 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4612 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4613
Mark Muellerd4914412016-06-13 17:52:06 -06004614 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4615 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4616 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4617 ds_layout_ci.pBindings = layout_binding;
4618 VkDescriptorSetLayout ds_layout;
4619 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4620 ASSERT_VK_SUCCESS(err);
4621
4622 VkDescriptorSetAllocateInfo alloc_info = {};
4623 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4624 alloc_info.descriptorSetCount = 1;
4625 alloc_info.descriptorPool = ds_pool;
4626 alloc_info.pSetLayouts = &ds_layout;
4627 VkDescriptorSet descriptorSet;
4628 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4629 ASSERT_VK_SUCCESS(err);
4630
4631 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4632 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4633 pipeline_layout_ci.pNext = NULL;
4634 pipeline_layout_ci.setLayoutCount = 1;
4635 pipeline_layout_ci.pSetLayouts = &ds_layout;
4636
4637 VkPipelineLayout pipeline_layout;
4638 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4639 ASSERT_VK_SUCCESS(err);
4640
Mark Mueller5c838ce2016-06-16 09:54:29 -06004641 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004642 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4643 descriptor_write.dstSet = descriptorSet;
4644 descriptor_write.dstBinding = 0;
4645 descriptor_write.descriptorCount = 1;
4646 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4647
Mark Mueller5c838ce2016-06-16 09:54:29 -06004648 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
4652 // Create a buffer to update the descriptor with
4653 uint32_t qfi = 0;
4654 VkBufferCreateInfo buffCI = {};
4655 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4656 buffCI.size = 1024;
4657 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4658 buffCI.queueFamilyIndexCount = 1;
4659 buffCI.pQueueFamilyIndices = &qfi;
4660
4661 VkBuffer dyub;
4662 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4663 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004664
Tony Barboure132c5f2016-12-12 11:50:20 -07004665 VkDeviceMemory mem;
4666 VkMemoryRequirements mem_reqs;
4667 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4668
4669 VkMemoryAllocateInfo mem_alloc_info = {};
4670 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4671 mem_alloc_info.allocationSize = mem_reqs.size;
4672 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4673 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4674 ASSERT_VK_SUCCESS(err);
4675
4676 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4677 ASSERT_VK_SUCCESS(err);
4678
4679 VkDescriptorBufferInfo buffInfo[2] = {};
4680 buffInfo[0].buffer = dyub;
4681 buffInfo[0].offset = 0;
4682 buffInfo[0].range = 1024;
4683 buffInfo[1].buffer = dyub;
4684 buffInfo[1].offset = 0;
4685 buffInfo[1].range = 1024;
4686 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004687 descriptor_write.descriptorCount = 2;
4688
Mark Mueller5c838ce2016-06-16 09:54:29 -06004689 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4692 m_errorMonitor->VerifyFound();
4693
Mark Mueller5c838ce2016-06-16 09:54:29 -06004694 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4695 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004696 descriptor_write.dstBinding = 1;
4697 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004698
Mark Mueller5c838ce2016-06-16 09:54:29 -06004699 // Make pImageInfo index non-null to avoid complaints of it missing
4700 VkDescriptorImageInfo imageInfo = {};
4701 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4702 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004704 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4705 m_errorMonitor->VerifyFound();
4706
Mark Muellerd4914412016-06-13 17:52:06 -06004707 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004708 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004709 vkDestroySampler(m_device->device(), sampler, NULL);
4710 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4711 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4712 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4713}
4714
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004715TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004716 TEST_DESCRIPTION(
4717 "Attempt to draw with a command buffer that is invalid "
4718 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004719 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004720
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004721 VkBuffer buffer;
4722 VkDeviceMemory mem;
4723 VkMemoryRequirements mem_reqs;
4724
4725 VkBufferCreateInfo buf_info = {};
4726 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004727 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004728 buf_info.size = 256;
4729 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4730 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4731 ASSERT_VK_SUCCESS(err);
4732
4733 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4734
4735 VkMemoryAllocateInfo alloc_info = {};
4736 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4737 alloc_info.allocationSize = 256;
4738 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004739 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004740 if (!pass) {
4741 vkDestroyBuffer(m_device->device(), buffer, NULL);
4742 return;
4743 }
4744 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4748 ASSERT_VK_SUCCESS(err);
4749
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004750 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004751 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004752 m_commandBuffer->EndCommandBuffer();
4753
Mark Lobodzinski33826372017-04-13 11:10:11 -06004754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004755 // Destroy buffer dependency prior to submit to cause ERROR
4756 vkDestroyBuffer(m_device->device(), buffer, NULL);
4757
4758 VkSubmitInfo submit_info = {};
4759 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4760 submit_info.commandBufferCount = 1;
4761 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4762 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4763
4764 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004765 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004766 vkFreeMemory(m_device->handle(), mem, NULL);
4767}
4768
Tobin Ehlisea413442016-09-28 10:23:59 -06004769TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4770 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4771
Tony Barbour1fa09702017-03-16 12:09:08 -06004772 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004773 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4774
4775 VkDescriptorPoolSize ds_type_count;
4776 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4777 ds_type_count.descriptorCount = 1;
4778
4779 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4780 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4781 ds_pool_ci.maxSets = 1;
4782 ds_pool_ci.poolSizeCount = 1;
4783 ds_pool_ci.pPoolSizes = &ds_type_count;
4784
4785 VkDescriptorPool ds_pool;
4786 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4787 ASSERT_VK_SUCCESS(err);
4788
4789 VkDescriptorSetLayoutBinding layout_binding;
4790 layout_binding.binding = 0;
4791 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4792 layout_binding.descriptorCount = 1;
4793 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4794 layout_binding.pImmutableSamplers = NULL;
4795
4796 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4797 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4798 ds_layout_ci.bindingCount = 1;
4799 ds_layout_ci.pBindings = &layout_binding;
4800 VkDescriptorSetLayout ds_layout;
4801 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4802 ASSERT_VK_SUCCESS(err);
4803
4804 VkDescriptorSetAllocateInfo alloc_info = {};
4805 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4806 alloc_info.descriptorSetCount = 1;
4807 alloc_info.descriptorPool = ds_pool;
4808 alloc_info.pSetLayouts = &ds_layout;
4809 VkDescriptorSet descriptor_set;
4810 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4811 ASSERT_VK_SUCCESS(err);
4812
4813 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4814 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4815 pipeline_layout_ci.pNext = NULL;
4816 pipeline_layout_ci.setLayoutCount = 1;
4817 pipeline_layout_ci.pSetLayouts = &ds_layout;
4818
4819 VkPipelineLayout pipeline_layout;
4820 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4821 ASSERT_VK_SUCCESS(err);
4822
4823 VkBuffer buffer;
4824 uint32_t queue_family_index = 0;
4825 VkBufferCreateInfo buffer_create_info = {};
4826 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4827 buffer_create_info.size = 1024;
4828 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4829 buffer_create_info.queueFamilyIndexCount = 1;
4830 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4831
4832 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4833 ASSERT_VK_SUCCESS(err);
4834
4835 VkMemoryRequirements memory_reqs;
4836 VkDeviceMemory buffer_memory;
4837
4838 VkMemoryAllocateInfo memory_info = {};
4839 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4840 memory_info.allocationSize = 0;
4841 memory_info.memoryTypeIndex = 0;
4842
4843 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4844 memory_info.allocationSize = memory_reqs.size;
4845 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4846 ASSERT_TRUE(pass);
4847
4848 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4849 ASSERT_VK_SUCCESS(err);
4850 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4851 ASSERT_VK_SUCCESS(err);
4852
4853 VkBufferView view;
4854 VkBufferViewCreateInfo bvci = {};
4855 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4856 bvci.buffer = buffer;
4857 bvci.format = VK_FORMAT_R8_UNORM;
4858 bvci.range = VK_WHOLE_SIZE;
4859
4860 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4861 ASSERT_VK_SUCCESS(err);
4862
4863 VkWriteDescriptorSet descriptor_write = {};
4864 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4865 descriptor_write.dstSet = descriptor_set;
4866 descriptor_write.dstBinding = 0;
4867 descriptor_write.descriptorCount = 1;
4868 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4869 descriptor_write.pTexelBufferView = &view;
4870
4871 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4872
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004873 char const *vsSource =
4874 "#version 450\n"
4875 "\n"
4876 "out gl_PerVertex { \n"
4877 " vec4 gl_Position;\n"
4878 "};\n"
4879 "void main(){\n"
4880 " gl_Position = vec4(1);\n"
4881 "}\n";
4882 char const *fsSource =
4883 "#version 450\n"
4884 "\n"
4885 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4886 "layout(location=0) out vec4 x;\n"
4887 "void main(){\n"
4888 " x = imageLoad(s, 0);\n"
4889 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004890 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4891 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4892 VkPipelineObj pipe(m_device);
4893 pipe.AddShader(&vs);
4894 pipe.AddShader(&fs);
4895 pipe.AddColorAttachment();
4896 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4897
Mark Lobodzinski33826372017-04-13 11:10:11 -06004898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004899
Tony Barbour552f6c02016-12-21 14:34:07 -07004900 m_commandBuffer->BeginCommandBuffer();
4901 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4902
Tobin Ehlisea413442016-09-28 10:23:59 -06004903 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4904 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4905 VkRect2D scissor = {{0, 0}, {16, 16}};
4906 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4907 // Bind pipeline to cmd buffer
4908 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4909 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4910 &descriptor_set, 0, nullptr);
4911 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004912 m_commandBuffer->EndRenderPass();
4913 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004914
4915 // Delete BufferView in order to invalidate cmd buffer
4916 vkDestroyBufferView(m_device->device(), view, NULL);
4917 // Now attempt submit of cmd buffer
4918 VkSubmitInfo submit_info = {};
4919 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4920 submit_info.commandBufferCount = 1;
4921 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4922 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4923 m_errorMonitor->VerifyFound();
4924
4925 // Clean-up
4926 vkDestroyBuffer(m_device->device(), buffer, NULL);
4927 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4928 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4929 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4930 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4931}
4932
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004933TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004934 TEST_DESCRIPTION(
4935 "Attempt to draw with a command buffer that is invalid "
4936 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004937 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004938
4939 VkImage image;
4940 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4941 VkImageCreateInfo image_create_info = {};
4942 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4943 image_create_info.pNext = NULL;
4944 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4945 image_create_info.format = tex_format;
4946 image_create_info.extent.width = 32;
4947 image_create_info.extent.height = 32;
4948 image_create_info.extent.depth = 1;
4949 image_create_info.mipLevels = 1;
4950 image_create_info.arrayLayers = 1;
4951 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4952 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004953 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004954 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004955 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004956 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004957 // Have to bind memory to image before recording cmd in cmd buffer using it
4958 VkMemoryRequirements mem_reqs;
4959 VkDeviceMemory image_mem;
4960 bool pass;
4961 VkMemoryAllocateInfo mem_alloc = {};
4962 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4963 mem_alloc.pNext = NULL;
4964 mem_alloc.memoryTypeIndex = 0;
4965 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4966 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004967 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004968 ASSERT_TRUE(pass);
4969 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4970 ASSERT_VK_SUCCESS(err);
4971 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4972 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004973
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004974 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004975 VkClearColorValue ccv;
4976 ccv.float32[0] = 1.0f;
4977 ccv.float32[1] = 1.0f;
4978 ccv.float32[2] = 1.0f;
4979 ccv.float32[3] = 1.0f;
4980 VkImageSubresourceRange isr = {};
4981 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004982 isr.baseArrayLayer = 0;
4983 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004984 isr.layerCount = 1;
4985 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004986 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004987 m_commandBuffer->EndCommandBuffer();
4988
Mark Lobodzinski33826372017-04-13 11:10:11 -06004989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004990 // Destroy image dependency prior to submit to cause ERROR
4991 vkDestroyImage(m_device->device(), image, NULL);
4992
4993 VkSubmitInfo submit_info = {};
4994 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4995 submit_info.commandBufferCount = 1;
4996 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4997 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4998
4999 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06005000 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06005001}
5002
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005003TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005004 TEST_DESCRIPTION(
5005 "Attempt to draw with a command buffer that is invalid "
5006 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005007 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005008 VkFormatProperties format_properties;
5009 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005010 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5011 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005012 return;
5013 }
5014
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005015 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5016
5017 VkImageCreateInfo image_ci = {};
5018 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5019 image_ci.pNext = NULL;
5020 image_ci.imageType = VK_IMAGE_TYPE_2D;
5021 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5022 image_ci.extent.width = 32;
5023 image_ci.extent.height = 32;
5024 image_ci.extent.depth = 1;
5025 image_ci.mipLevels = 1;
5026 image_ci.arrayLayers = 1;
5027 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5028 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005029 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005030 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5031 image_ci.flags = 0;
5032 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005033 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005034
5035 VkMemoryRequirements memory_reqs;
5036 VkDeviceMemory image_memory;
5037 bool pass;
5038 VkMemoryAllocateInfo memory_info = {};
5039 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5040 memory_info.pNext = NULL;
5041 memory_info.allocationSize = 0;
5042 memory_info.memoryTypeIndex = 0;
5043 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5044 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005045 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005046 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005047 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005048 ASSERT_VK_SUCCESS(err);
5049 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5050 ASSERT_VK_SUCCESS(err);
5051
5052 VkImageViewCreateInfo ivci = {
5053 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5054 nullptr,
5055 0,
5056 image,
5057 VK_IMAGE_VIEW_TYPE_2D,
5058 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005059 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005060 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5061 };
5062 VkImageView view;
5063 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5064 ASSERT_VK_SUCCESS(err);
5065
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005066 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005067 VkFramebuffer fb;
5068 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5069 ASSERT_VK_SUCCESS(err);
5070
5071 // Just use default renderpass with our framebuffer
5072 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005073 m_renderPassBeginInfo.renderArea.extent.width = 32;
5074 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005075 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005076 m_commandBuffer->BeginCommandBuffer();
5077 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5078 m_commandBuffer->EndRenderPass();
5079 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005080 // Destroy image attached to framebuffer to invalidate cmd buffer
5081 vkDestroyImage(m_device->device(), image, NULL);
5082 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005084 QueueCommandBuffer(false);
5085 m_errorMonitor->VerifyFound();
5086
5087 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5088 vkDestroyImageView(m_device->device(), view, nullptr);
5089 vkFreeMemory(m_device->device(), image_memory, nullptr);
5090}
5091
Tobin Ehlisb329f992016-10-12 13:20:29 -06005092TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5093 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005094 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005095 VkFormatProperties format_properties;
5096 VkResult err = VK_SUCCESS;
5097 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5098
Tobin Ehlisb329f992016-10-12 13:20:29 -06005099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5100
5101 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005102 image.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005103 ASSERT_TRUE(image.initialized());
5104 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5105
5106 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5107 VkFramebuffer fb;
5108 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5109 ASSERT_VK_SUCCESS(err);
5110
5111 // Just use default renderpass with our framebuffer
5112 m_renderPassBeginInfo.framebuffer = fb;
5113 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005114 m_commandBuffer->BeginCommandBuffer();
5115 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5116 m_commandBuffer->EndRenderPass();
5117 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005118 // Submit cmd buffer to put it in-flight
5119 VkSubmitInfo submit_info = {};
5120 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5121 submit_info.commandBufferCount = 1;
5122 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5123 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5124 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005126 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5127 m_errorMonitor->VerifyFound();
5128 // Wait for queue to complete so we can safely destroy everything
5129 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005130 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5131 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005132 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5133}
5134
Tobin Ehlis88becd72016-09-21 14:33:41 -06005135TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5136 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005137 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005138 VkFormatProperties format_properties;
5139 VkResult err = VK_SUCCESS;
5140 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005141
Tobin Ehlis88becd72016-09-21 14:33:41 -06005142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5143
5144 VkImageCreateInfo image_ci = {};
5145 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5146 image_ci.pNext = NULL;
5147 image_ci.imageType = VK_IMAGE_TYPE_2D;
5148 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5149 image_ci.extent.width = 256;
5150 image_ci.extent.height = 256;
5151 image_ci.extent.depth = 1;
5152 image_ci.mipLevels = 1;
5153 image_ci.arrayLayers = 1;
5154 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5155 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005156 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005157 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5158 image_ci.flags = 0;
5159 VkImage image;
5160 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5161
5162 VkMemoryRequirements memory_reqs;
5163 VkDeviceMemory image_memory;
5164 bool pass;
5165 VkMemoryAllocateInfo memory_info = {};
5166 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5167 memory_info.pNext = NULL;
5168 memory_info.allocationSize = 0;
5169 memory_info.memoryTypeIndex = 0;
5170 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5171 memory_info.allocationSize = memory_reqs.size;
5172 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5173 ASSERT_TRUE(pass);
5174 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5175 ASSERT_VK_SUCCESS(err);
5176 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5177 ASSERT_VK_SUCCESS(err);
5178
5179 VkImageViewCreateInfo ivci = {
5180 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5181 nullptr,
5182 0,
5183 image,
5184 VK_IMAGE_VIEW_TYPE_2D,
5185 VK_FORMAT_B8G8R8A8_UNORM,
5186 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5187 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5188 };
5189 VkImageView view;
5190 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5191 ASSERT_VK_SUCCESS(err);
5192
5193 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5194 VkFramebuffer fb;
5195 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5196 ASSERT_VK_SUCCESS(err);
5197
5198 // Just use default renderpass with our framebuffer
5199 m_renderPassBeginInfo.framebuffer = fb;
5200 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005201 m_commandBuffer->BeginCommandBuffer();
5202 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5203 m_commandBuffer->EndRenderPass();
5204 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005205 // Submit cmd buffer to put it (and attached imageView) in-flight
5206 VkSubmitInfo submit_info = {};
5207 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5208 submit_info.commandBufferCount = 1;
5209 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5210 // Submit cmd buffer to put framebuffer and children in-flight
5211 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5212 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005214 vkDestroyImage(m_device->device(), image, NULL);
5215 m_errorMonitor->VerifyFound();
5216 // Wait for queue to complete so we can safely destroy image and other objects
5217 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005218 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5219 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005220 vkDestroyImage(m_device->device(), image, NULL);
5221 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5222 vkDestroyImageView(m_device->device(), view, nullptr);
5223 vkFreeMemory(m_device->device(), image_memory, nullptr);
5224}
5225
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005226TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5227 TEST_DESCRIPTION("Delete in-use renderPass.");
5228
Tony Barbour1fa09702017-03-16 12:09:08 -06005229 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5231
5232 // Create simple renderpass
5233 VkAttachmentReference attach = {};
5234 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5235 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005236 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005237 subpass.pColorAttachments = &attach;
5238 VkRenderPassCreateInfo rpci = {};
5239 rpci.subpassCount = 1;
5240 rpci.pSubpasses = &subpass;
5241 rpci.attachmentCount = 1;
5242 VkAttachmentDescription attach_desc = {};
5243 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5244 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5245 rpci.pAttachments = &attach_desc;
5246 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5247 VkRenderPass rp;
5248 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5249 ASSERT_VK_SUCCESS(err);
5250
5251 // Create a pipeline that uses the given renderpass
5252 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5253 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5254
5255 VkPipelineLayout pipeline_layout;
5256 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5257 ASSERT_VK_SUCCESS(err);
5258
5259 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5260 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5261 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005262 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005263 vp_state_ci.pViewports = &vp;
5264 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005265 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005266 vp_state_ci.pScissors = &scissors;
5267
5268 VkPipelineShaderStageCreateInfo shaderStages[2];
5269 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5270
5271 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005272 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005273 // but add it to be able to run on more devices
5274 shaderStages[0] = vs.GetStageCreateInfo();
5275 shaderStages[1] = fs.GetStageCreateInfo();
5276
5277 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5278 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5279
5280 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5281 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5282 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5283
5284 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5285 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5286 rs_ci.rasterizerDiscardEnable = true;
5287 rs_ci.lineWidth = 1.0f;
5288
5289 VkPipelineColorBlendAttachmentState att = {};
5290 att.blendEnable = VK_FALSE;
5291 att.colorWriteMask = 0xf;
5292
5293 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5294 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5295 cb_ci.attachmentCount = 1;
5296 cb_ci.pAttachments = &att;
5297
5298 VkGraphicsPipelineCreateInfo gp_ci = {};
5299 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5300 gp_ci.stageCount = 2;
5301 gp_ci.pStages = shaderStages;
5302 gp_ci.pVertexInputState = &vi_ci;
5303 gp_ci.pInputAssemblyState = &ia_ci;
5304 gp_ci.pViewportState = &vp_state_ci;
5305 gp_ci.pRasterizationState = &rs_ci;
5306 gp_ci.pColorBlendState = &cb_ci;
5307 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5308 gp_ci.layout = pipeline_layout;
5309 gp_ci.renderPass = rp;
5310
5311 VkPipelineCacheCreateInfo pc_ci = {};
5312 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5313
Dave Houlton756e6742017-03-23 14:33:22 -06005314 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005315 VkPipeline pipeline;
5316 VkPipelineCache pipe_cache;
5317 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5318 ASSERT_VK_SUCCESS(err);
5319
5320 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5321 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005322
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005323 // Bind pipeline to cmd buffer, will also bind renderpass
5324 m_commandBuffer->BeginCommandBuffer();
5325 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5326 m_commandBuffer->EndCommandBuffer();
5327
5328 VkSubmitInfo submit_info = {};
5329 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5330 submit_info.commandBufferCount = 1;
5331 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5332 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005333 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005334
5335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5336 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5337 m_errorMonitor->VerifyFound();
5338
5339 // Wait for queue to complete so we can safely destroy everything
5340 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005341 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005342 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005343 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5344 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5345 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5346 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5347}
5348
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005349TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005350 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005351 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005352
5353 VkImage image;
5354 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5355 VkImageCreateInfo image_create_info = {};
5356 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5357 image_create_info.pNext = NULL;
5358 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5359 image_create_info.format = tex_format;
5360 image_create_info.extent.width = 32;
5361 image_create_info.extent.height = 32;
5362 image_create_info.extent.depth = 1;
5363 image_create_info.mipLevels = 1;
5364 image_create_info.arrayLayers = 1;
5365 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5366 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005367 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005368 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005370 ASSERT_VK_SUCCESS(err);
5371 // Have to bind memory to image before recording cmd in cmd buffer using it
5372 VkMemoryRequirements mem_reqs;
5373 VkDeviceMemory image_mem;
5374 bool pass;
5375 VkMemoryAllocateInfo mem_alloc = {};
5376 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5377 mem_alloc.pNext = NULL;
5378 mem_alloc.memoryTypeIndex = 0;
5379 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5380 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005381 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005382 ASSERT_TRUE(pass);
5383 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5384 ASSERT_VK_SUCCESS(err);
5385
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005386 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005388 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005389
5390 m_commandBuffer->BeginCommandBuffer();
5391 VkClearColorValue ccv;
5392 ccv.float32[0] = 1.0f;
5393 ccv.float32[1] = 1.0f;
5394 ccv.float32[2] = 1.0f;
5395 ccv.float32[3] = 1.0f;
5396 VkImageSubresourceRange isr = {};
5397 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5398 isr.baseArrayLayer = 0;
5399 isr.baseMipLevel = 0;
5400 isr.layerCount = 1;
5401 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005402 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005403 m_commandBuffer->EndCommandBuffer();
5404
5405 m_errorMonitor->VerifyFound();
5406 vkDestroyImage(m_device->device(), image, NULL);
5407 vkFreeMemory(m_device->device(), image_mem, nullptr);
5408}
5409
5410TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005411 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005412 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005413
5414 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005415 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005416 VK_IMAGE_TILING_OPTIMAL, 0);
5417 ASSERT_TRUE(image.initialized());
5418
5419 VkBuffer buffer;
5420 VkDeviceMemory mem;
5421 VkMemoryRequirements mem_reqs;
5422
5423 VkBufferCreateInfo buf_info = {};
5424 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005425 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005426 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005427 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5428 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5429 ASSERT_VK_SUCCESS(err);
5430
5431 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5432
5433 VkMemoryAllocateInfo alloc_info = {};
5434 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005435 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005436 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005437 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005438 if (!pass) {
5439 vkDestroyBuffer(m_device->device(), buffer, NULL);
5440 return;
5441 }
5442 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5443 ASSERT_VK_SUCCESS(err);
5444
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005445 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005447 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005448 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005449 region.bufferRowLength = 16;
5450 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005451 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5452
5453 region.imageSubresource.layerCount = 1;
5454 region.imageExtent.height = 4;
5455 region.imageExtent.width = 4;
5456 region.imageExtent.depth = 1;
5457 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005458 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5459 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005460 m_commandBuffer->EndCommandBuffer();
5461
5462 m_errorMonitor->VerifyFound();
5463
5464 vkDestroyBuffer(m_device->device(), buffer, NULL);
5465 vkFreeMemory(m_device->handle(), mem, NULL);
5466}
5467
Tobin Ehlis85940f52016-07-07 16:57:21 -06005468TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005469 TEST_DESCRIPTION(
5470 "Attempt to draw with a command buffer that is invalid "
5471 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005472 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005473
5474 VkEvent event;
5475 VkEventCreateInfo evci = {};
5476 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5477 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5478 ASSERT_VK_SUCCESS(result);
5479
5480 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005481 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005482 m_commandBuffer->EndCommandBuffer();
5483
Mark Lobodzinski33826372017-04-13 11:10:11 -06005484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005485 // Destroy event dependency prior to submit to cause ERROR
5486 vkDestroyEvent(m_device->device(), event, NULL);
5487
5488 VkSubmitInfo submit_info = {};
5489 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5490 submit_info.commandBufferCount = 1;
5491 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5492 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5493
5494 m_errorMonitor->VerifyFound();
5495}
5496
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005497TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005498 TEST_DESCRIPTION(
5499 "Attempt to draw with a command buffer that is invalid "
5500 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005501 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005502
5503 VkQueryPool query_pool;
5504 VkQueryPoolCreateInfo qpci{};
5505 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5506 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5507 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005508 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005509 ASSERT_VK_SUCCESS(result);
5510
5511 m_commandBuffer->BeginCommandBuffer();
5512 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5513 m_commandBuffer->EndCommandBuffer();
5514
Mark Lobodzinski33826372017-04-13 11:10:11 -06005515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005516 // Destroy query pool dependency prior to submit to cause ERROR
5517 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5518
5519 VkSubmitInfo submit_info = {};
5520 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5521 submit_info.commandBufferCount = 1;
5522 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5523 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5524
5525 m_errorMonitor->VerifyFound();
5526}
5527
Tobin Ehlis24130d92016-07-08 15:50:53 -06005528TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005529 TEST_DESCRIPTION(
5530 "Attempt to draw with a command buffer that is invalid "
5531 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005532 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005533 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5534
5535 VkResult err;
5536
5537 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5538 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5539
5540 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005541 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005542 ASSERT_VK_SUCCESS(err);
5543
5544 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5545 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5546 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005547 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005548 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005549 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005550 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005551 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005552
5553 VkPipelineShaderStageCreateInfo shaderStages[2];
5554 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5555
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005556 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005557 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005558 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005559 shaderStages[0] = vs.GetStageCreateInfo();
5560 shaderStages[1] = fs.GetStageCreateInfo();
5561
5562 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5563 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5564
5565 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5566 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5567 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5568
5569 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5570 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005571 rs_ci.rasterizerDiscardEnable = true;
5572 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005573
5574 VkPipelineColorBlendAttachmentState att = {};
5575 att.blendEnable = VK_FALSE;
5576 att.colorWriteMask = 0xf;
5577
5578 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5579 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5580 cb_ci.attachmentCount = 1;
5581 cb_ci.pAttachments = &att;
5582
5583 VkGraphicsPipelineCreateInfo gp_ci = {};
5584 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5585 gp_ci.stageCount = 2;
5586 gp_ci.pStages = shaderStages;
5587 gp_ci.pVertexInputState = &vi_ci;
5588 gp_ci.pInputAssemblyState = &ia_ci;
5589 gp_ci.pViewportState = &vp_state_ci;
5590 gp_ci.pRasterizationState = &rs_ci;
5591 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005592 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5593 gp_ci.layout = pipeline_layout;
5594 gp_ci.renderPass = renderPass();
5595
5596 VkPipelineCacheCreateInfo pc_ci = {};
5597 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5598
5599 VkPipeline pipeline;
5600 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005601 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005602 ASSERT_VK_SUCCESS(err);
5603
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005604 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005605 ASSERT_VK_SUCCESS(err);
5606
5607 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005608 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005609 m_commandBuffer->EndCommandBuffer();
5610 // Now destroy pipeline in order to cause error when submitting
5611 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5612
Mark Lobodzinski33826372017-04-13 11:10:11 -06005613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005614
5615 VkSubmitInfo submit_info = {};
5616 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5617 submit_info.commandBufferCount = 1;
5618 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5619 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5620
5621 m_errorMonitor->VerifyFound();
5622 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5623 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5624}
5625
Tobin Ehlis31289162016-08-17 14:57:58 -06005626TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005627 TEST_DESCRIPTION(
5628 "Attempt to draw with a command buffer that is invalid "
5629 "due to a bound descriptor set with a buffer dependency "
5630 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005631 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005632 ASSERT_NO_FATAL_FAILURE(InitViewport());
5633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5634
5635 VkDescriptorPoolSize ds_type_count = {};
5636 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5637 ds_type_count.descriptorCount = 1;
5638
5639 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5640 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5641 ds_pool_ci.pNext = NULL;
5642 ds_pool_ci.maxSets = 1;
5643 ds_pool_ci.poolSizeCount = 1;
5644 ds_pool_ci.pPoolSizes = &ds_type_count;
5645
5646 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005647 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005648 ASSERT_VK_SUCCESS(err);
5649
5650 VkDescriptorSetLayoutBinding dsl_binding = {};
5651 dsl_binding.binding = 0;
5652 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5653 dsl_binding.descriptorCount = 1;
5654 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5655 dsl_binding.pImmutableSamplers = NULL;
5656
5657 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5658 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5659 ds_layout_ci.pNext = NULL;
5660 ds_layout_ci.bindingCount = 1;
5661 ds_layout_ci.pBindings = &dsl_binding;
5662 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005663 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005664 ASSERT_VK_SUCCESS(err);
5665
5666 VkDescriptorSet descriptorSet;
5667 VkDescriptorSetAllocateInfo alloc_info = {};
5668 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5669 alloc_info.descriptorSetCount = 1;
5670 alloc_info.descriptorPool = ds_pool;
5671 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005672 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005673 ASSERT_VK_SUCCESS(err);
5674
5675 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5676 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5677 pipeline_layout_ci.pNext = NULL;
5678 pipeline_layout_ci.setLayoutCount = 1;
5679 pipeline_layout_ci.pSetLayouts = &ds_layout;
5680
5681 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005682 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005683 ASSERT_VK_SUCCESS(err);
5684
5685 // Create a buffer to update the descriptor with
5686 uint32_t qfi = 0;
5687 VkBufferCreateInfo buffCI = {};
5688 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5689 buffCI.size = 1024;
5690 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5691 buffCI.queueFamilyIndexCount = 1;
5692 buffCI.pQueueFamilyIndices = &qfi;
5693
5694 VkBuffer buffer;
5695 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5696 ASSERT_VK_SUCCESS(err);
5697 // Allocate memory and bind to buffer so we can make it to the appropriate
5698 // error
5699 VkMemoryAllocateInfo mem_alloc = {};
5700 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5701 mem_alloc.pNext = NULL;
5702 mem_alloc.allocationSize = 1024;
5703 mem_alloc.memoryTypeIndex = 0;
5704
5705 VkMemoryRequirements memReqs;
5706 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005707 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005708 if (!pass) {
5709 vkDestroyBuffer(m_device->device(), buffer, NULL);
5710 return;
5711 }
5712
5713 VkDeviceMemory mem;
5714 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5715 ASSERT_VK_SUCCESS(err);
5716 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5717 ASSERT_VK_SUCCESS(err);
5718 // Correctly update descriptor to avoid "NOT_UPDATED" error
5719 VkDescriptorBufferInfo buffInfo = {};
5720 buffInfo.buffer = buffer;
5721 buffInfo.offset = 0;
5722 buffInfo.range = 1024;
5723
5724 VkWriteDescriptorSet descriptor_write;
5725 memset(&descriptor_write, 0, sizeof(descriptor_write));
5726 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5727 descriptor_write.dstSet = descriptorSet;
5728 descriptor_write.dstBinding = 0;
5729 descriptor_write.descriptorCount = 1;
5730 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5731 descriptor_write.pBufferInfo = &buffInfo;
5732
5733 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5734
5735 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005736 char const *vsSource =
5737 "#version 450\n"
5738 "\n"
5739 "out gl_PerVertex { \n"
5740 " vec4 gl_Position;\n"
5741 "};\n"
5742 "void main(){\n"
5743 " gl_Position = vec4(1);\n"
5744 "}\n";
5745 char const *fsSource =
5746 "#version 450\n"
5747 "\n"
5748 "layout(location=0) out vec4 x;\n"
5749 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5750 "void main(){\n"
5751 " x = vec4(bar.y);\n"
5752 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005753 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5754 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5755 VkPipelineObj pipe(m_device);
5756 pipe.AddShader(&vs);
5757 pipe.AddShader(&fs);
5758 pipe.AddColorAttachment();
5759 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5760
Tony Barbour552f6c02016-12-21 14:34:07 -07005761 m_commandBuffer->BeginCommandBuffer();
5762 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005763 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5764 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5765 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005766
5767 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5768 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5769
Tobin Ehlis31289162016-08-17 14:57:58 -06005770 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005771 m_commandBuffer->EndRenderPass();
5772 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005774 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5775 vkDestroyBuffer(m_device->device(), buffer, NULL);
5776 // Attempt to submit cmd buffer
5777 VkSubmitInfo submit_info = {};
5778 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5779 submit_info.commandBufferCount = 1;
5780 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5781 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5782 m_errorMonitor->VerifyFound();
5783 // Cleanup
5784 vkFreeMemory(m_device->device(), mem, NULL);
5785
5786 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5787 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5788 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5789}
5790
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005792 TEST_DESCRIPTION(
5793 "Attempt to draw with a command buffer that is invalid "
5794 "due to a bound descriptor sets with a combined image "
5795 "sampler having their image, sampler, and descriptor set "
5796 "each respectively destroyed and then attempting to "
5797 "submit associated cmd buffers. Attempt to destroy a "
5798 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005799 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005800 ASSERT_NO_FATAL_FAILURE(InitViewport());
5801 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5802
5803 VkDescriptorPoolSize ds_type_count = {};
5804 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5805 ds_type_count.descriptorCount = 1;
5806
5807 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5808 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5809 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005810 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005811 ds_pool_ci.maxSets = 1;
5812 ds_pool_ci.poolSizeCount = 1;
5813 ds_pool_ci.pPoolSizes = &ds_type_count;
5814
5815 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005816 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005817 ASSERT_VK_SUCCESS(err);
5818
5819 VkDescriptorSetLayoutBinding dsl_binding = {};
5820 dsl_binding.binding = 0;
5821 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5822 dsl_binding.descriptorCount = 1;
5823 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5824 dsl_binding.pImmutableSamplers = NULL;
5825
5826 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5827 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5828 ds_layout_ci.pNext = NULL;
5829 ds_layout_ci.bindingCount = 1;
5830 ds_layout_ci.pBindings = &dsl_binding;
5831 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005833 ASSERT_VK_SUCCESS(err);
5834
5835 VkDescriptorSet descriptorSet;
5836 VkDescriptorSetAllocateInfo alloc_info = {};
5837 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5838 alloc_info.descriptorSetCount = 1;
5839 alloc_info.descriptorPool = ds_pool;
5840 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005841 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005842 ASSERT_VK_SUCCESS(err);
5843
5844 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5845 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5846 pipeline_layout_ci.pNext = NULL;
5847 pipeline_layout_ci.setLayoutCount = 1;
5848 pipeline_layout_ci.pSetLayouts = &ds_layout;
5849
5850 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005851 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005852 ASSERT_VK_SUCCESS(err);
5853
5854 // Create images to update the descriptor with
5855 VkImage image;
5856 VkImage image2;
5857 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5858 const int32_t tex_width = 32;
5859 const int32_t tex_height = 32;
5860 VkImageCreateInfo image_create_info = {};
5861 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5862 image_create_info.pNext = NULL;
5863 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5864 image_create_info.format = tex_format;
5865 image_create_info.extent.width = tex_width;
5866 image_create_info.extent.height = tex_height;
5867 image_create_info.extent.depth = 1;
5868 image_create_info.mipLevels = 1;
5869 image_create_info.arrayLayers = 1;
5870 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5871 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5872 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5873 image_create_info.flags = 0;
5874 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5875 ASSERT_VK_SUCCESS(err);
5876 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5877 ASSERT_VK_SUCCESS(err);
5878
5879 VkMemoryRequirements memory_reqs;
5880 VkDeviceMemory image_memory;
5881 bool pass;
5882 VkMemoryAllocateInfo memory_info = {};
5883 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5884 memory_info.pNext = NULL;
5885 memory_info.allocationSize = 0;
5886 memory_info.memoryTypeIndex = 0;
5887 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5888 // Allocate enough memory for both images
5889 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005890 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005891 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005892 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005893 ASSERT_VK_SUCCESS(err);
5894 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5895 ASSERT_VK_SUCCESS(err);
5896 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005897 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005898 ASSERT_VK_SUCCESS(err);
5899
5900 VkImageViewCreateInfo image_view_create_info = {};
5901 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5902 image_view_create_info.image = image;
5903 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5904 image_view_create_info.format = tex_format;
5905 image_view_create_info.subresourceRange.layerCount = 1;
5906 image_view_create_info.subresourceRange.baseMipLevel = 0;
5907 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005908 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005909
5910 VkImageView view;
5911 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005912 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005913 ASSERT_VK_SUCCESS(err);
5914 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005915 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005916 ASSERT_VK_SUCCESS(err);
5917 // Create Samplers
5918 VkSamplerCreateInfo sampler_ci = {};
5919 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5920 sampler_ci.pNext = NULL;
5921 sampler_ci.magFilter = VK_FILTER_NEAREST;
5922 sampler_ci.minFilter = VK_FILTER_NEAREST;
5923 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5924 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5925 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5926 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5927 sampler_ci.mipLodBias = 1.0;
5928 sampler_ci.anisotropyEnable = VK_FALSE;
5929 sampler_ci.maxAnisotropy = 1;
5930 sampler_ci.compareEnable = VK_FALSE;
5931 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5932 sampler_ci.minLod = 1.0;
5933 sampler_ci.maxLod = 1.0;
5934 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5935 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5936 VkSampler sampler;
5937 VkSampler sampler2;
5938 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5939 ASSERT_VK_SUCCESS(err);
5940 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5941 ASSERT_VK_SUCCESS(err);
5942 // Update descriptor with image and sampler
5943 VkDescriptorImageInfo img_info = {};
5944 img_info.sampler = sampler;
5945 img_info.imageView = view;
5946 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5947
5948 VkWriteDescriptorSet descriptor_write;
5949 memset(&descriptor_write, 0, sizeof(descriptor_write));
5950 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5951 descriptor_write.dstSet = descriptorSet;
5952 descriptor_write.dstBinding = 0;
5953 descriptor_write.descriptorCount = 1;
5954 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5955 descriptor_write.pImageInfo = &img_info;
5956
5957 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5958
5959 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005960 char const *vsSource =
5961 "#version 450\n"
5962 "\n"
5963 "out gl_PerVertex { \n"
5964 " vec4 gl_Position;\n"
5965 "};\n"
5966 "void main(){\n"
5967 " gl_Position = vec4(1);\n"
5968 "}\n";
5969 char const *fsSource =
5970 "#version 450\n"
5971 "\n"
5972 "layout(set=0, binding=0) uniform sampler2D s;\n"
5973 "layout(location=0) out vec4 x;\n"
5974 "void main(){\n"
5975 " x = texture(s, vec2(1));\n"
5976 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005977 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5978 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5979 VkPipelineObj pipe(m_device);
5980 pipe.AddShader(&vs);
5981 pipe.AddShader(&fs);
5982 pipe.AddColorAttachment();
5983 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5984
5985 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005987 m_commandBuffer->BeginCommandBuffer();
5988 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005989 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5990 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5991 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005992 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5993 VkRect2D scissor = {{0, 0}, {16, 16}};
5994 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5995 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005996 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005997 m_commandBuffer->EndRenderPass();
5998 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005999 // Destroy sampler invalidates the cmd buffer, causing error on submit
6000 vkDestroySampler(m_device->device(), sampler, NULL);
6001 // Attempt to submit cmd buffer
6002 VkSubmitInfo submit_info = {};
6003 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6004 submit_info.commandBufferCount = 1;
6005 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6006 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6007 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07006008
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006009 // Now re-update descriptor with valid sampler and delete image
6010 img_info.sampler = sampler2;
6011 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006012
6013 VkCommandBufferBeginInfo info = {};
6014 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6015 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
6016
Mark Lobodzinski33826372017-04-13 11:10:11 -06006017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07006018 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006019 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006020 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6021 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6022 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006023 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6024 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006026 m_commandBuffer->EndRenderPass();
6027 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006028 // Destroy image invalidates the cmd buffer, causing error on submit
6029 vkDestroyImage(m_device->device(), image, NULL);
6030 // Attempt to submit cmd buffer
6031 submit_info = {};
6032 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6033 submit_info.commandBufferCount = 1;
6034 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6035 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6036 m_errorMonitor->VerifyFound();
6037 // Now update descriptor to be valid, but then free descriptor
6038 img_info.imageView = view2;
6039 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006040 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006041 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006042 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6043 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6044 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006045 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6046 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006047 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006048 m_commandBuffer->EndRenderPass();
6049 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006050 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006051
6052 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006054 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006055 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006056
6057 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006058 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006059 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006060 m_errorMonitor->SetUnexpectedError(
6061 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6062 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006063 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006064 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6065
6066 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006067 submit_info = {};
6068 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6069 submit_info.commandBufferCount = 1;
6070 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006072 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6073 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006074
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006075 // Cleanup
6076 vkFreeMemory(m_device->device(), image_memory, NULL);
6077 vkDestroySampler(m_device->device(), sampler2, NULL);
6078 vkDestroyImage(m_device->device(), image2, NULL);
6079 vkDestroyImageView(m_device->device(), view, NULL);
6080 vkDestroyImageView(m_device->device(), view2, NULL);
6081 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6082 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6083 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6084}
6085
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006086TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6087 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6088 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6089 ASSERT_NO_FATAL_FAILURE(InitViewport());
6090 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6091
6092 VkDescriptorPoolSize ds_type_count = {};
6093 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6094 ds_type_count.descriptorCount = 1;
6095
6096 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6097 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6098 ds_pool_ci.pNext = NULL;
6099 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6100 ds_pool_ci.maxSets = 1;
6101 ds_pool_ci.poolSizeCount = 1;
6102 ds_pool_ci.pPoolSizes = &ds_type_count;
6103
6104 VkDescriptorPool ds_pool;
6105 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6106 ASSERT_VK_SUCCESS(err);
6107
6108 VkDescriptorSetLayoutBinding dsl_binding = {};
6109 dsl_binding.binding = 0;
6110 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6111 dsl_binding.descriptorCount = 1;
6112 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6113 dsl_binding.pImmutableSamplers = NULL;
6114
6115 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6116 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6117 ds_layout_ci.pNext = NULL;
6118 ds_layout_ci.bindingCount = 1;
6119 ds_layout_ci.pBindings = &dsl_binding;
6120 VkDescriptorSetLayout ds_layout;
6121 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6122 ASSERT_VK_SUCCESS(err);
6123
6124 VkDescriptorSet descriptorSet;
6125 VkDescriptorSetAllocateInfo alloc_info = {};
6126 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6127 alloc_info.descriptorSetCount = 1;
6128 alloc_info.descriptorPool = ds_pool;
6129 alloc_info.pSetLayouts = &ds_layout;
6130 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6131 ASSERT_VK_SUCCESS(err);
6132
6133 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6134 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6135 pipeline_layout_ci.pNext = NULL;
6136 pipeline_layout_ci.setLayoutCount = 1;
6137 pipeline_layout_ci.pSetLayouts = &ds_layout;
6138
6139 VkPipelineLayout pipeline_layout;
6140 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6141 ASSERT_VK_SUCCESS(err);
6142
6143 // Create images to update the descriptor with
6144 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6145 VkImageObj image(m_device);
6146 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6147 0);
6148 ASSERT_TRUE(image.initialized());
6149
6150 VkImageViewCreateInfo image_view_create_info = {};
6151 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6152 image_view_create_info.image = image.handle();
6153 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6154 image_view_create_info.format = format;
6155 image_view_create_info.subresourceRange.layerCount = 1;
6156 image_view_create_info.subresourceRange.baseMipLevel = 0;
6157 image_view_create_info.subresourceRange.levelCount = 1;
6158 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6159
6160 VkImageView view;
6161 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6162 ASSERT_VK_SUCCESS(err);
6163 // Create Sampler
6164 VkSamplerCreateInfo sampler_ci = {};
6165 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6166 sampler_ci.pNext = NULL;
6167 sampler_ci.magFilter = VK_FILTER_NEAREST;
6168 sampler_ci.minFilter = VK_FILTER_NEAREST;
6169 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6170 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6171 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6172 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6173 sampler_ci.mipLodBias = 1.0;
6174 sampler_ci.anisotropyEnable = VK_FALSE;
6175 sampler_ci.maxAnisotropy = 1;
6176 sampler_ci.compareEnable = VK_FALSE;
6177 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6178 sampler_ci.minLod = 1.0;
6179 sampler_ci.maxLod = 1.0;
6180 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6181 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6182 VkSampler sampler;
6183 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6184 ASSERT_VK_SUCCESS(err);
6185 // Update descriptor with image and sampler
6186 VkDescriptorImageInfo img_info = {};
6187 img_info.sampler = sampler;
6188 img_info.imageView = view;
6189 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6190 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6191
6192 VkWriteDescriptorSet descriptor_write;
6193 memset(&descriptor_write, 0, sizeof(descriptor_write));
6194 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6195 descriptor_write.dstSet = descriptorSet;
6196 descriptor_write.dstBinding = 0;
6197 descriptor_write.descriptorCount = 1;
6198 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6199 descriptor_write.pImageInfo = &img_info;
6200
6201 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6202
6203 // Create PSO to be used for draw-time errors below
6204 char const *vsSource =
6205 "#version 450\n"
6206 "\n"
6207 "out gl_PerVertex { \n"
6208 " vec4 gl_Position;\n"
6209 "};\n"
6210 "void main(){\n"
6211 " gl_Position = vec4(1);\n"
6212 "}\n";
6213 char const *fsSource =
6214 "#version 450\n"
6215 "\n"
6216 "layout(set=0, binding=0) uniform sampler2D s;\n"
6217 "layout(location=0) out vec4 x;\n"
6218 "void main(){\n"
6219 " x = texture(s, vec2(1));\n"
6220 "}\n";
6221 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6222 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6223 VkPipelineObj pipe(m_device);
6224 pipe.AddShader(&vs);
6225 pipe.AddShader(&fs);
6226 pipe.AddColorAttachment();
6227 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6228
6229 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6230 cmd_buf.BeginCommandBuffer();
6231 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
6232 // record layout different than actual descriptor layout of SHADER_RO
6233 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
6234 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6235 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6236 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6237 VkRect2D scissor = {{0, 0}, {16, 16}};
6238 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6239 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6240 // At draw time the update layout will mis-match the actual layout
6241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6242 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6243 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6244 m_errorMonitor->SetDesiredFailureMsg(
6245 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6246 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6247 cmd_buf.Draw(1, 0, 0, 0);
6248 m_errorMonitor->VerifyFound();
6249 cmd_buf.EndRenderPass();
6250 cmd_buf.EndCommandBuffer();
6251 // Submit cmd buffer
6252 VkSubmitInfo submit_info = {};
6253 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6254 submit_info.commandBufferCount = 1;
6255 submit_info.pCommandBuffers = &cmd_buf.handle();
6256 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6257 vkQueueWaitIdle(m_device->m_queue);
6258 // Cleanup
6259 vkDestroySampler(m_device->device(), sampler, NULL);
6260 vkDestroyImageView(m_device->device(), view, NULL);
6261 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6262 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6263 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6264}
6265
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006266TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6267 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006268 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006269 ASSERT_NO_FATAL_FAILURE(InitViewport());
6270 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6271
6272 VkDescriptorPoolSize ds_type_count = {};
6273 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6274 ds_type_count.descriptorCount = 1;
6275
6276 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6277 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6278 ds_pool_ci.pNext = NULL;
6279 ds_pool_ci.maxSets = 1;
6280 ds_pool_ci.poolSizeCount = 1;
6281 ds_pool_ci.pPoolSizes = &ds_type_count;
6282
6283 VkDescriptorPool ds_pool;
6284 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6285 ASSERT_VK_SUCCESS(err);
6286
6287 VkDescriptorSetLayoutBinding dsl_binding = {};
6288 dsl_binding.binding = 0;
6289 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6290 dsl_binding.descriptorCount = 1;
6291 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6292 dsl_binding.pImmutableSamplers = NULL;
6293
6294 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6295 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6296 ds_layout_ci.pNext = NULL;
6297 ds_layout_ci.bindingCount = 1;
6298 ds_layout_ci.pBindings = &dsl_binding;
6299 VkDescriptorSetLayout ds_layout;
6300 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6301 ASSERT_VK_SUCCESS(err);
6302
6303 VkDescriptorSet descriptor_set;
6304 VkDescriptorSetAllocateInfo alloc_info = {};
6305 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6306 alloc_info.descriptorSetCount = 1;
6307 alloc_info.descriptorPool = ds_pool;
6308 alloc_info.pSetLayouts = &ds_layout;
6309 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6310 ASSERT_VK_SUCCESS(err);
6311
6312 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6313 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6314 pipeline_layout_ci.pNext = NULL;
6315 pipeline_layout_ci.setLayoutCount = 1;
6316 pipeline_layout_ci.pSetLayouts = &ds_layout;
6317
6318 VkPipelineLayout pipeline_layout;
6319 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6320 ASSERT_VK_SUCCESS(err);
6321
6322 // Create image to update the descriptor with
6323 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006324 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006325 ASSERT_TRUE(image.initialized());
6326
6327 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6328 // Create Sampler
6329 VkSamplerCreateInfo sampler_ci = {};
6330 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6331 sampler_ci.pNext = NULL;
6332 sampler_ci.magFilter = VK_FILTER_NEAREST;
6333 sampler_ci.minFilter = VK_FILTER_NEAREST;
6334 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6335 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6336 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6337 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6338 sampler_ci.mipLodBias = 1.0;
6339 sampler_ci.anisotropyEnable = VK_FALSE;
6340 sampler_ci.maxAnisotropy = 1;
6341 sampler_ci.compareEnable = VK_FALSE;
6342 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6343 sampler_ci.minLod = 1.0;
6344 sampler_ci.maxLod = 1.0;
6345 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6346 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6347 VkSampler sampler;
6348 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6349 ASSERT_VK_SUCCESS(err);
6350 // Update descriptor with image and sampler
6351 VkDescriptorImageInfo img_info = {};
6352 img_info.sampler = sampler;
6353 img_info.imageView = view;
6354 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6355
6356 VkWriteDescriptorSet descriptor_write;
6357 memset(&descriptor_write, 0, sizeof(descriptor_write));
6358 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6359 descriptor_write.dstSet = descriptor_set;
6360 descriptor_write.dstBinding = 0;
6361 descriptor_write.descriptorCount = 1;
6362 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6363 descriptor_write.pImageInfo = &img_info;
6364
6365 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6366
6367 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006368 char const *vsSource =
6369 "#version 450\n"
6370 "\n"
6371 "out gl_PerVertex { \n"
6372 " vec4 gl_Position;\n"
6373 "};\n"
6374 "void main(){\n"
6375 " gl_Position = vec4(1);\n"
6376 "}\n";
6377 char const *fsSource =
6378 "#version 450\n"
6379 "\n"
6380 "layout(set=0, binding=0) uniform sampler2D s;\n"
6381 "layout(location=0) out vec4 x;\n"
6382 "void main(){\n"
6383 " x = texture(s, vec2(1));\n"
6384 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006385 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6386 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6387 VkPipelineObj pipe(m_device);
6388 pipe.AddShader(&vs);
6389 pipe.AddShader(&fs);
6390 pipe.AddColorAttachment();
6391 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6392
Tony Barbour552f6c02016-12-21 14:34:07 -07006393 m_commandBuffer->BeginCommandBuffer();
6394 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006395 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6396 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6397 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006398
6399 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6400 VkRect2D scissor = {{0, 0}, {16, 16}};
6401 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6402 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6403
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006404 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006405 m_commandBuffer->EndRenderPass();
6406 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006407 // Submit cmd buffer to put pool in-flight
6408 VkSubmitInfo submit_info = {};
6409 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6410 submit_info.commandBufferCount = 1;
6411 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6412 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6413 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006415 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6416 m_errorMonitor->VerifyFound();
6417 vkQueueWaitIdle(m_device->m_queue);
6418 // Cleanup
6419 vkDestroySampler(m_device->device(), sampler, NULL);
6420 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6421 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006422 m_errorMonitor->SetUnexpectedError(
6423 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006424 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006425 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006426 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006427}
6428
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006429TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6430 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006431 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006432 ASSERT_NO_FATAL_FAILURE(InitViewport());
6433 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6434
6435 VkDescriptorPoolSize ds_type_count = {};
6436 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6437 ds_type_count.descriptorCount = 1;
6438
6439 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6440 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6441 ds_pool_ci.pNext = NULL;
6442 ds_pool_ci.maxSets = 1;
6443 ds_pool_ci.poolSizeCount = 1;
6444 ds_pool_ci.pPoolSizes = &ds_type_count;
6445
6446 VkDescriptorPool ds_pool;
6447 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6448 ASSERT_VK_SUCCESS(err);
6449
6450 VkDescriptorSetLayoutBinding dsl_binding = {};
6451 dsl_binding.binding = 0;
6452 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6453 dsl_binding.descriptorCount = 1;
6454 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6455 dsl_binding.pImmutableSamplers = NULL;
6456
6457 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6458 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6459 ds_layout_ci.pNext = NULL;
6460 ds_layout_ci.bindingCount = 1;
6461 ds_layout_ci.pBindings = &dsl_binding;
6462 VkDescriptorSetLayout ds_layout;
6463 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6464 ASSERT_VK_SUCCESS(err);
6465
6466 VkDescriptorSet descriptorSet;
6467 VkDescriptorSetAllocateInfo alloc_info = {};
6468 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6469 alloc_info.descriptorSetCount = 1;
6470 alloc_info.descriptorPool = ds_pool;
6471 alloc_info.pSetLayouts = &ds_layout;
6472 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6473 ASSERT_VK_SUCCESS(err);
6474
6475 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6476 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6477 pipeline_layout_ci.pNext = NULL;
6478 pipeline_layout_ci.setLayoutCount = 1;
6479 pipeline_layout_ci.pSetLayouts = &ds_layout;
6480
6481 VkPipelineLayout pipeline_layout;
6482 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6483 ASSERT_VK_SUCCESS(err);
6484
6485 // Create images to update the descriptor with
6486 VkImage image;
6487 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6488 const int32_t tex_width = 32;
6489 const int32_t tex_height = 32;
6490 VkImageCreateInfo image_create_info = {};
6491 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6492 image_create_info.pNext = NULL;
6493 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6494 image_create_info.format = tex_format;
6495 image_create_info.extent.width = tex_width;
6496 image_create_info.extent.height = tex_height;
6497 image_create_info.extent.depth = 1;
6498 image_create_info.mipLevels = 1;
6499 image_create_info.arrayLayers = 1;
6500 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6501 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6502 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6503 image_create_info.flags = 0;
6504 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6505 ASSERT_VK_SUCCESS(err);
6506 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6507 VkMemoryRequirements memory_reqs;
6508 VkDeviceMemory image_memory;
6509 bool pass;
6510 VkMemoryAllocateInfo memory_info = {};
6511 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6512 memory_info.pNext = NULL;
6513 memory_info.allocationSize = 0;
6514 memory_info.memoryTypeIndex = 0;
6515 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6516 // Allocate enough memory for image
6517 memory_info.allocationSize = memory_reqs.size;
6518 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6519 ASSERT_TRUE(pass);
6520 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6521 ASSERT_VK_SUCCESS(err);
6522 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6523 ASSERT_VK_SUCCESS(err);
6524
6525 VkImageViewCreateInfo image_view_create_info = {};
6526 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6527 image_view_create_info.image = image;
6528 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6529 image_view_create_info.format = tex_format;
6530 image_view_create_info.subresourceRange.layerCount = 1;
6531 image_view_create_info.subresourceRange.baseMipLevel = 0;
6532 image_view_create_info.subresourceRange.levelCount = 1;
6533 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6534
6535 VkImageView view;
6536 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6537 ASSERT_VK_SUCCESS(err);
6538 // Create Samplers
6539 VkSamplerCreateInfo sampler_ci = {};
6540 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6541 sampler_ci.pNext = NULL;
6542 sampler_ci.magFilter = VK_FILTER_NEAREST;
6543 sampler_ci.minFilter = VK_FILTER_NEAREST;
6544 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6545 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6546 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6547 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6548 sampler_ci.mipLodBias = 1.0;
6549 sampler_ci.anisotropyEnable = VK_FALSE;
6550 sampler_ci.maxAnisotropy = 1;
6551 sampler_ci.compareEnable = VK_FALSE;
6552 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6553 sampler_ci.minLod = 1.0;
6554 sampler_ci.maxLod = 1.0;
6555 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6556 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6557 VkSampler sampler;
6558 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6559 ASSERT_VK_SUCCESS(err);
6560 // Update descriptor with image and sampler
6561 VkDescriptorImageInfo img_info = {};
6562 img_info.sampler = sampler;
6563 img_info.imageView = view;
6564 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6565
6566 VkWriteDescriptorSet descriptor_write;
6567 memset(&descriptor_write, 0, sizeof(descriptor_write));
6568 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6569 descriptor_write.dstSet = descriptorSet;
6570 descriptor_write.dstBinding = 0;
6571 descriptor_write.descriptorCount = 1;
6572 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6573 descriptor_write.pImageInfo = &img_info;
6574 // Break memory binding and attempt update
6575 vkFreeMemory(m_device->device(), image_memory, nullptr);
6576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006577 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6579 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6580 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6581 m_errorMonitor->VerifyFound();
6582 // Cleanup
6583 vkDestroyImage(m_device->device(), image, NULL);
6584 vkDestroySampler(m_device->device(), sampler, NULL);
6585 vkDestroyImageView(m_device->device(), view, NULL);
6586 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6587 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6588 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6589}
6590
Karl Schultz6addd812016-02-02 17:17:23 -07006591TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006592 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6593 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006594 // Create a valid cmd buffer
6595 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006596 uint64_t fake_pipeline_handle = 0xbaad6001;
6597 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006598 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6600
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006602 m_commandBuffer->BeginCommandBuffer();
6603 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006604 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006605 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006606
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006607 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006609 Draw(1, 0, 0, 0);
6610 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006611
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006612 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006614 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006615 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6616 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006617}
6618
Karl Schultz6addd812016-02-02 17:17:23 -07006619TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006620 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006621 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006622
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006624
Tony Barbour1fa09702017-03-16 12:09:08 -06006625 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006626 ASSERT_NO_FATAL_FAILURE(InitViewport());
6627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006628 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006629 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6630 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006631
6632 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006633 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6634 ds_pool_ci.pNext = NULL;
6635 ds_pool_ci.maxSets = 1;
6636 ds_pool_ci.poolSizeCount = 1;
6637 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006638
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006639 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006640 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006641 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006642
Tony Barboureb254902015-07-15 12:50:33 -06006643 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006644 dsl_binding.binding = 0;
6645 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6646 dsl_binding.descriptorCount = 1;
6647 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6648 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006649
Tony Barboureb254902015-07-15 12:50:33 -06006650 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006651 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6652 ds_layout_ci.pNext = NULL;
6653 ds_layout_ci.bindingCount = 1;
6654 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006655 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006656 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006657 ASSERT_VK_SUCCESS(err);
6658
6659 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006660 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006661 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006662 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006663 alloc_info.descriptorPool = ds_pool;
6664 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006665 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006666 ASSERT_VK_SUCCESS(err);
6667
Tony Barboureb254902015-07-15 12:50:33 -06006668 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006669 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6670 pipeline_layout_ci.pNext = NULL;
6671 pipeline_layout_ci.setLayoutCount = 1;
6672 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006673
6674 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006675 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006676 ASSERT_VK_SUCCESS(err);
6677
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006678 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006679 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006680 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006681 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006682
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006683 VkPipelineObj pipe(m_device);
6684 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006685 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006686 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006687 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006688
Tony Barbour552f6c02016-12-21 14:34:07 -07006689 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006690 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6691 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6692 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006693
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006694 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006695
Chia-I Wuf7458c52015-10-26 21:10:41 +08006696 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6697 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6698 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006699}
6700
Karl Schultz6addd812016-02-02 17:17:23 -07006701TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006702 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006703 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006704
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006706
Tony Barbour1fa09702017-03-16 12:09:08 -06006707 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006708 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006709 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6710 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006711
6712 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006713 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6714 ds_pool_ci.pNext = NULL;
6715 ds_pool_ci.maxSets = 1;
6716 ds_pool_ci.poolSizeCount = 1;
6717 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006718
6719 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006720 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006721 ASSERT_VK_SUCCESS(err);
6722
6723 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006724 dsl_binding.binding = 0;
6725 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6726 dsl_binding.descriptorCount = 1;
6727 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6728 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006729
6730 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006731 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6732 ds_layout_ci.pNext = NULL;
6733 ds_layout_ci.bindingCount = 1;
6734 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006735 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006736 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006737 ASSERT_VK_SUCCESS(err);
6738
6739 VkDescriptorSet descriptorSet;
6740 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006741 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006742 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006743 alloc_info.descriptorPool = ds_pool;
6744 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006745 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006746 ASSERT_VK_SUCCESS(err);
6747
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006748 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006749 VkWriteDescriptorSet descriptor_write;
6750 memset(&descriptor_write, 0, sizeof(descriptor_write));
6751 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6752 descriptor_write.dstSet = descriptorSet;
6753 descriptor_write.dstBinding = 0;
6754 descriptor_write.descriptorCount = 1;
6755 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6756 descriptor_write.pTexelBufferView = &view;
6757
6758 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6759
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006760 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006761
6762 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6763 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6764}
6765
Mark Youngd339ba32016-05-30 13:28:35 -06006766TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006767 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006768
6769 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006771 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006772
Tony Barbour1fa09702017-03-16 12:09:08 -06006773 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006774
6775 // Create a buffer with no bound memory and then attempt to create
6776 // a buffer view.
6777 VkBufferCreateInfo buff_ci = {};
6778 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006779 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006780 buff_ci.size = 256;
6781 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6782 VkBuffer buffer;
6783 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6784 ASSERT_VK_SUCCESS(err);
6785
6786 VkBufferViewCreateInfo buff_view_ci = {};
6787 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6788 buff_view_ci.buffer = buffer;
6789 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6790 buff_view_ci.range = VK_WHOLE_SIZE;
6791 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006792 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006793
6794 m_errorMonitor->VerifyFound();
6795 vkDestroyBuffer(m_device->device(), buffer, NULL);
6796 // If last error is success, it still created the view, so delete it.
6797 if (err == VK_SUCCESS) {
6798 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6799 }
6800}
6801
Karl Schultz6addd812016-02-02 17:17:23 -07006802TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6803 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6804 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006805 // 1. No dynamicOffset supplied
6806 // 2. Too many dynamicOffsets supplied
6807 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006808 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6810 " requires 1 dynamicOffsets, but only "
6811 "0 dynamicOffsets are left in "
6812 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006813
Tony Barbour1fa09702017-03-16 12:09:08 -06006814 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006815 ASSERT_NO_FATAL_FAILURE(InitViewport());
6816 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6817
6818 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006819 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6820 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006821
6822 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006823 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6824 ds_pool_ci.pNext = NULL;
6825 ds_pool_ci.maxSets = 1;
6826 ds_pool_ci.poolSizeCount = 1;
6827 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006828
6829 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006830 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006831 ASSERT_VK_SUCCESS(err);
6832
6833 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006834 dsl_binding.binding = 0;
6835 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6836 dsl_binding.descriptorCount = 1;
6837 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6838 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006839
6840 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006841 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6842 ds_layout_ci.pNext = NULL;
6843 ds_layout_ci.bindingCount = 1;
6844 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006845 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006846 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006847 ASSERT_VK_SUCCESS(err);
6848
6849 VkDescriptorSet descriptorSet;
6850 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006851 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006852 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006853 alloc_info.descriptorPool = ds_pool;
6854 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006855 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006856 ASSERT_VK_SUCCESS(err);
6857
6858 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006859 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6860 pipeline_layout_ci.pNext = NULL;
6861 pipeline_layout_ci.setLayoutCount = 1;
6862 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006863
6864 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006865 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006866 ASSERT_VK_SUCCESS(err);
6867
6868 // Create a buffer to update the descriptor with
6869 uint32_t qfi = 0;
6870 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006871 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6872 buffCI.size = 1024;
6873 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6874 buffCI.queueFamilyIndexCount = 1;
6875 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006876
6877 VkBuffer dyub;
6878 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6879 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006880 // Allocate memory and bind to buffer so we can make it to the appropriate
6881 // error
6882 VkMemoryAllocateInfo mem_alloc = {};
6883 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6884 mem_alloc.pNext = NULL;
6885 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006886 mem_alloc.memoryTypeIndex = 0;
6887
6888 VkMemoryRequirements memReqs;
6889 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006890 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006891 if (!pass) {
6892 vkDestroyBuffer(m_device->device(), dyub, NULL);
6893 return;
6894 }
6895
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006896 VkDeviceMemory mem;
6897 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6898 ASSERT_VK_SUCCESS(err);
6899 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6900 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006901 // Correctly update descriptor to avoid "NOT_UPDATED" error
6902 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006903 buffInfo.buffer = dyub;
6904 buffInfo.offset = 0;
6905 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006906
6907 VkWriteDescriptorSet descriptor_write;
6908 memset(&descriptor_write, 0, sizeof(descriptor_write));
6909 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6910 descriptor_write.dstSet = descriptorSet;
6911 descriptor_write.dstBinding = 0;
6912 descriptor_write.descriptorCount = 1;
6913 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6914 descriptor_write.pBufferInfo = &buffInfo;
6915
6916 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6917
Tony Barbour552f6c02016-12-21 14:34:07 -07006918 m_commandBuffer->BeginCommandBuffer();
6919 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006920 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6921 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006922 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006923 uint32_t pDynOff[2] = {512, 756};
6924 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6926 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6927 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6928 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006929 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006930 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6932 " dynamic offset 512 combined with "
6933 "offset 0 and range 1024 that "
6934 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006935 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006936 char const *vsSource =
6937 "#version 450\n"
6938 "\n"
6939 "out gl_PerVertex { \n"
6940 " vec4 gl_Position;\n"
6941 "};\n"
6942 "void main(){\n"
6943 " gl_Position = vec4(1);\n"
6944 "}\n";
6945 char const *fsSource =
6946 "#version 450\n"
6947 "\n"
6948 "layout(location=0) out vec4 x;\n"
6949 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6950 "void main(){\n"
6951 " x = vec4(bar.y);\n"
6952 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006953 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6954 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6955 VkPipelineObj pipe(m_device);
6956 pipe.AddShader(&vs);
6957 pipe.AddShader(&fs);
6958 pipe.AddColorAttachment();
6959 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6960
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006961 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6962 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6963 VkRect2D scissor = {{0, 0}, {16, 16}};
6964 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6965
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006966 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006967 // This update should succeed, but offset size of 512 will overstep buffer
6968 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006969 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6970 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006971 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006972 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006973
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006974 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006975 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006976
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006977 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006978 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006979 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6980}
6981
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006982TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006983 TEST_DESCRIPTION(
6984 "Attempt to update a descriptor with a non-sparse buffer "
6985 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006986 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006988 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6990 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006991
Tony Barbour1fa09702017-03-16 12:09:08 -06006992 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006993 ASSERT_NO_FATAL_FAILURE(InitViewport());
6994 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6995
6996 VkDescriptorPoolSize ds_type_count = {};
6997 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6998 ds_type_count.descriptorCount = 1;
6999
7000 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7001 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7002 ds_pool_ci.pNext = NULL;
7003 ds_pool_ci.maxSets = 1;
7004 ds_pool_ci.poolSizeCount = 1;
7005 ds_pool_ci.pPoolSizes = &ds_type_count;
7006
7007 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007008 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007009 ASSERT_VK_SUCCESS(err);
7010
7011 VkDescriptorSetLayoutBinding dsl_binding = {};
7012 dsl_binding.binding = 0;
7013 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7014 dsl_binding.descriptorCount = 1;
7015 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7016 dsl_binding.pImmutableSamplers = NULL;
7017
7018 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7019 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7020 ds_layout_ci.pNext = NULL;
7021 ds_layout_ci.bindingCount = 1;
7022 ds_layout_ci.pBindings = &dsl_binding;
7023 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007024 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007025 ASSERT_VK_SUCCESS(err);
7026
7027 VkDescriptorSet descriptorSet;
7028 VkDescriptorSetAllocateInfo alloc_info = {};
7029 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7030 alloc_info.descriptorSetCount = 1;
7031 alloc_info.descriptorPool = ds_pool;
7032 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007033 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007034 ASSERT_VK_SUCCESS(err);
7035
7036 // Create a buffer to update the descriptor with
7037 uint32_t qfi = 0;
7038 VkBufferCreateInfo buffCI = {};
7039 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7040 buffCI.size = 1024;
7041 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7042 buffCI.queueFamilyIndexCount = 1;
7043 buffCI.pQueueFamilyIndices = &qfi;
7044
7045 VkBuffer dyub;
7046 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7047 ASSERT_VK_SUCCESS(err);
7048
7049 // Attempt to update descriptor without binding memory to it
7050 VkDescriptorBufferInfo buffInfo = {};
7051 buffInfo.buffer = dyub;
7052 buffInfo.offset = 0;
7053 buffInfo.range = 1024;
7054
7055 VkWriteDescriptorSet descriptor_write;
7056 memset(&descriptor_write, 0, sizeof(descriptor_write));
7057 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7058 descriptor_write.dstSet = descriptorSet;
7059 descriptor_write.dstBinding = 0;
7060 descriptor_write.descriptorCount = 1;
7061 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7062 descriptor_write.pBufferInfo = &buffInfo;
7063
7064 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7065 m_errorMonitor->VerifyFound();
7066
7067 vkDestroyBuffer(m_device->device(), dyub, NULL);
7068 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7069 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7070}
7071
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007072TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007073 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007074 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007075 ASSERT_NO_FATAL_FAILURE(InitViewport());
7076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7077
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007078 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007079 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007080 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7081 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7082 pipeline_layout_ci.pushConstantRangeCount = 1;
7083 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7084
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007085 //
7086 // Check for invalid push constant ranges in pipeline layouts.
7087 //
7088 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007089 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007090 char const *msg;
7091 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007092
Karl Schultzc81037d2016-05-12 08:11:23 -06007093 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7094 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7095 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7096 "vkCreatePipelineLayout() call has push constants index 0 with "
7097 "size 0."},
7098 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7099 "vkCreatePipelineLayout() call has push constants index 0 with "
7100 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007101 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007102 "vkCreatePipelineLayout() call has push constants index 0 with "
7103 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007104 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007105 "vkCreatePipelineLayout() call has push constants index 0 with "
7106 "size 0."},
7107 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7108 "vkCreatePipelineLayout() call has push constants index 0 with "
7109 "offset 1. Offset must"},
7110 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7111 "vkCreatePipelineLayout() call has push constants index 0 "
7112 "with offset "},
7113 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7114 "vkCreatePipelineLayout() call has push constants "
7115 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007116 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007117 "vkCreatePipelineLayout() call has push constants index 0 "
7118 "with offset "},
7119 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7120 "vkCreatePipelineLayout() call has push "
7121 "constants index 0 with offset "},
7122 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7123 "vkCreatePipelineLayout() call has push "
7124 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007125 }};
7126
7127 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007128 for (const auto &iter : range_tests) {
7129 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7131 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007132 m_errorMonitor->VerifyFound();
7133 if (VK_SUCCESS == err) {
7134 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7135 }
7136 }
7137
7138 // Check for invalid stage flag
7139 pc_range.offset = 0;
7140 pc_range.size = 16;
7141 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007142 m_errorMonitor->SetDesiredFailureMsg(
7143 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7144 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007145 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007146 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007147 if (VK_SUCCESS == err) {
7148 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7149 }
7150
Karl Schultzc59b72d2017-02-24 15:45:05 -07007151 // Check for duplicate stage flags in a list of push constant ranges.
7152 // A shader can only have one push constant block and that block is mapped
7153 // to the push constant range that has that shader's stage flag set.
7154 // The shader's stage flag can only appear once in all the ranges, so the
7155 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007156 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007157 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007158 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007159 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007160 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007161 // Overlapping ranges are OK, but a stage flag can appear only once.
7162 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7163 {
7164 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7165 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7166 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7167 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007168 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007169 {
7170 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7171 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7172 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7173 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7174 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7175 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7176 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7177 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7178 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7179 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7180 }},
7181 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7182 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7183 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7184 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7185 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7186 {
7187 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7188 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7189 }},
7190 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7191 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7192 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7193 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7194 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7195 {
7196 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7197 }},
7198 },
7199 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007200
Karl Schultzc59b72d2017-02-24 15:45:05 -07007201 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007202 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007203 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007205 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007206 m_errorMonitor->VerifyFound();
7207 if (VK_SUCCESS == err) {
7208 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7209 }
7210 }
7211
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007212 //
7213 // CmdPushConstants tests
7214 //
7215
Karl Schultzc59b72d2017-02-24 15:45:05 -07007216 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007217 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007218 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007219 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007220 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007221 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007222 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007223 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007224
7225 const uint8_t dummy_values[100] = {};
7226
7227 m_commandBuffer->BeginCommandBuffer();
7228 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007229
7230 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007231 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007233 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007234 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007235
Karl Schultzc59b72d2017-02-24 15:45:05 -07007236 m_errorMonitor->ExpectSuccess();
7237 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7238 m_errorMonitor->VerifyNotFound();
7239 m_errorMonitor->ExpectSuccess();
7240 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7241 m_errorMonitor->VerifyNotFound();
7242 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7243 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7244 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7245 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7246 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7247 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7248 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007249 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007250 for (const auto &iter : cmd_range_tests) {
7251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7252 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7253 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007254 m_errorMonitor->VerifyFound();
7255 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007256
Tony Barbour552f6c02016-12-21 14:34:07 -07007257 m_commandBuffer->EndRenderPass();
7258 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007259 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007260}
7261
Karl Schultz6addd812016-02-02 17:17:23 -07007262TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007263 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007264 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007265
Tony Barbour1fa09702017-03-16 12:09:08 -06007266 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007267 ASSERT_NO_FATAL_FAILURE(InitViewport());
7268 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7269
7270 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7271 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007272 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7273 ds_type_count[0].descriptorCount = 10;
7274 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7275 ds_type_count[1].descriptorCount = 2;
7276 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7277 ds_type_count[2].descriptorCount = 2;
7278 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7279 ds_type_count[3].descriptorCount = 5;
7280 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7281 // type
7282 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7283 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7284 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007285
7286 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007287 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7288 ds_pool_ci.pNext = NULL;
7289 ds_pool_ci.maxSets = 5;
7290 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7291 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007292
7293 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007294 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007295 ASSERT_VK_SUCCESS(err);
7296
7297 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7298 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007299 dsl_binding[0].binding = 0;
7300 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7301 dsl_binding[0].descriptorCount = 5;
7302 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7303 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007304
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007305 // Create layout identical to set0 layout but w/ different stageFlags
7306 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007307 dsl_fs_stage_only.binding = 0;
7308 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7309 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007310 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7311 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007312 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007313 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007314 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7315 ds_layout_ci.pNext = NULL;
7316 ds_layout_ci.bindingCount = 1;
7317 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007318 static const uint32_t NUM_LAYOUTS = 4;
7319 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007320 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007321 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7322 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007323 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007324 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007325 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007326 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007327 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007328 dsl_binding[0].binding = 0;
7329 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007330 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007331 dsl_binding[1].binding = 1;
7332 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7333 dsl_binding[1].descriptorCount = 2;
7334 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7335 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007336 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007337 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007338 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007339 ASSERT_VK_SUCCESS(err);
7340 dsl_binding[0].binding = 0;
7341 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007342 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007343 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007344 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007345 ASSERT_VK_SUCCESS(err);
7346 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007347 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007348 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007349 ASSERT_VK_SUCCESS(err);
7350
7351 static const uint32_t NUM_SETS = 4;
7352 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7353 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007354 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007355 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007356 alloc_info.descriptorPool = ds_pool;
7357 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007358 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007359 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007360 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007361 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007362 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007363 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007364 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007365
7366 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007367 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7368 pipeline_layout_ci.pNext = NULL;
7369 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7370 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007371
7372 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007373 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007374 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007375 // Create pipelineLayout with only one setLayout
7376 pipeline_layout_ci.setLayoutCount = 1;
7377 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007378 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007379 ASSERT_VK_SUCCESS(err);
7380 // Create pipelineLayout with 2 descriptor setLayout at index 0
7381 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7382 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007383 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007384 ASSERT_VK_SUCCESS(err);
7385 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7386 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7387 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007388 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007389 ASSERT_VK_SUCCESS(err);
7390 // Create pipelineLayout with UB type, but stageFlags for FS only
7391 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7392 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007393 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007394 ASSERT_VK_SUCCESS(err);
7395 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7396 VkDescriptorSetLayout pl_bad_s0[2] = {};
7397 pl_bad_s0[0] = ds_layout_fs_only;
7398 pl_bad_s0[1] = ds_layout[1];
7399 pipeline_layout_ci.setLayoutCount = 2;
7400 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7401 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007402 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007403 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007404
Tobin Ehlis88452832015-12-03 09:40:56 -07007405 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007406 char const *vsSource =
7407 "#version 450\n"
7408 "\n"
7409 "out gl_PerVertex {\n"
7410 " vec4 gl_Position;\n"
7411 "};\n"
7412 "void main(){\n"
7413 " gl_Position = vec4(1);\n"
7414 "}\n";
7415 char const *fsSource =
7416 "#version 450\n"
7417 "\n"
7418 "layout(location=0) out vec4 x;\n"
7419 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7420 "void main(){\n"
7421 " x = vec4(bar.y);\n"
7422 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007423 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7424 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007425 VkPipelineObj pipe(m_device);
7426 pipe.AddShader(&vs);
7427 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007428 pipe.AddColorAttachment();
7429 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007430
Tony Barbour552f6c02016-12-21 14:34:07 -07007431 m_commandBuffer->BeginCommandBuffer();
7432 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007433
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007434 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007435 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7436 // of PSO
7437 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7438 // cmd_pipeline.c
7439 // due to the fact that cmd_alloc_dset_data() has not been called in
7440 // cmd_bind_graphics_pipeline()
7441 // TODO : Want to cause various binding incompatibility issues here to test
7442 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007443 // First cause various verify_layout_compatibility() fails
7444 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007445 // verify_set_layout_compatibility fail cases:
7446 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007448 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7449 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007450 m_errorMonitor->VerifyFound();
7451
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007452 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7454 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7455 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007456 m_errorMonitor->VerifyFound();
7457
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007458 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007459 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7460 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7462 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7463 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007464 m_errorMonitor->VerifyFound();
7465
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007466 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7467 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7469 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7470 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007471 m_errorMonitor->VerifyFound();
7472
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007473 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7474 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7476 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7477 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7478 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007479 m_errorMonitor->VerifyFound();
7480
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007481 // Cause INFO messages due to disturbing previously bound Sets
7482 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007483 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7484 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007485 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7487 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7488 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007489 m_errorMonitor->VerifyFound();
7490
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007491 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7492 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007493 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7495 " newly bound as set #0 so set #1 and "
7496 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007497 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7498 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007499 m_errorMonitor->VerifyFound();
7500
Tobin Ehlis10fad692016-07-07 12:00:36 -06007501 // Now that we're done actively using the pipelineLayout that gfx pipeline
7502 // was created with, we should be able to delete it. Do that now to verify
7503 // that validation obeys pipelineLayout lifetime
7504 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7505
Tobin Ehlis88452832015-12-03 09:40:56 -07007506 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007507 // 1. Error due to not binding required set (we actually use same code as
7508 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007509 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7510 &descriptorSet[0], 0, NULL);
7511 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7512 &descriptorSet[1], 0, NULL);
7513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007514
7515 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7516 VkRect2D scissor = {{0, 0}, {16, 16}};
7517 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7518 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7519
Tobin Ehlis88452832015-12-03 09:40:56 -07007520 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007521 m_errorMonitor->VerifyFound();
7522
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007523 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007524 // 2. Error due to bound set not being compatible with PSO's
7525 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007526 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7527 &descriptorSet[0], 0, NULL);
7528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007529 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007530 m_errorMonitor->VerifyFound();
7531
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007532 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007533 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007534 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7535 }
7536 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007537 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7538 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7539}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007540
Karl Schultz6addd812016-02-02 17:17:23 -07007541TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7543 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007544
Tony Barbour1fa09702017-03-16 12:09:08 -06007545 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007546 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007547 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007548 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007549
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007550 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007551}
7552
Karl Schultz6addd812016-02-02 17:17:23 -07007553TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7554 VkResult err;
7555 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007556
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007558
Tony Barbour1fa09702017-03-16 12:09:08 -06007559 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007560
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007561 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007562 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007563 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007564 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007565 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007566 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007567
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007568 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007569 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007570
7571 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007572 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007573 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7574
7575 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007576 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007577 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007578 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007579 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007580
7581 // The error should be caught by validation of the BeginCommandBuffer call
7582 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7583
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007584 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007585 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007586}
7587
Karl Schultz6addd812016-02-02 17:17:23 -07007588TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007589 // Cause error due to Begin while recording CB
7590 // Then cause 2 errors for attempting to reset CB w/o having
7591 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7592 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007594
Tony Barbour1fa09702017-03-16 12:09:08 -06007595 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007596
7597 // Calls AllocateCommandBuffers
7598 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7599
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007600 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007601 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007602 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7603 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007604 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7605 cmd_buf_info.pNext = NULL;
7606 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007607 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007608
7609 // Begin CB to transition to recording state
7610 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7611 // Can't re-begin. This should trigger error
7612 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007613 m_errorMonitor->VerifyFound();
7614
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007616 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007617 // Reset attempt will trigger error due to incorrect CommandPool state
7618 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007619 m_errorMonitor->VerifyFound();
7620
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007622 // Transition CB to RECORDED state
7623 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7624 // Now attempting to Begin will implicitly reset, which triggers error
7625 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007626 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007627}
7628
Karl Schultz6addd812016-02-02 17:17:23 -07007629TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007630 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007631 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007632
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7634 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007635
Tony Barbour1fa09702017-03-16 12:09:08 -06007636 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007637 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007638
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007639 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007640 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7641 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007642
7643 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007644 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7645 ds_pool_ci.pNext = NULL;
7646 ds_pool_ci.maxSets = 1;
7647 ds_pool_ci.poolSizeCount = 1;
7648 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007649
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007650 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007651 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007652 ASSERT_VK_SUCCESS(err);
7653
Tony Barboureb254902015-07-15 12:50:33 -06007654 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007655 dsl_binding.binding = 0;
7656 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7657 dsl_binding.descriptorCount = 1;
7658 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7659 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007660
Tony Barboureb254902015-07-15 12:50:33 -06007661 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007662 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7663 ds_layout_ci.pNext = NULL;
7664 ds_layout_ci.bindingCount = 1;
7665 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007666
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007667 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007668 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007669 ASSERT_VK_SUCCESS(err);
7670
7671 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007672 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007673 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007674 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007675 alloc_info.descriptorPool = ds_pool;
7676 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007677 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007678 ASSERT_VK_SUCCESS(err);
7679
Tony Barboureb254902015-07-15 12:50:33 -06007680 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007681 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7682 pipeline_layout_ci.setLayoutCount = 1;
7683 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007684
7685 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007686 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007687 ASSERT_VK_SUCCESS(err);
7688
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007689 VkViewport vp = {}; // Just need dummy vp to point to
7690 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007691
7692 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007693 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7694 vp_state_ci.scissorCount = 1;
7695 vp_state_ci.pScissors = &sc;
7696 vp_state_ci.viewportCount = 1;
7697 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007698
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007699 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7700 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7701 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7702 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7703 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7704 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007705 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007706 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007707 rs_state_ci.lineWidth = 1.0f;
7708
7709 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7710 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7711 vi_ci.pNext = nullptr;
7712 vi_ci.vertexBindingDescriptionCount = 0;
7713 vi_ci.pVertexBindingDescriptions = nullptr;
7714 vi_ci.vertexAttributeDescriptionCount = 0;
7715 vi_ci.pVertexAttributeDescriptions = nullptr;
7716
7717 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7718 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7719 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7720
7721 VkPipelineShaderStageCreateInfo shaderStages[2];
7722 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7723
7724 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7725 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007726 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007727 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007728
Tony Barboureb254902015-07-15 12:50:33 -06007729 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007730 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7731 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007732 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007733 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7734 gp_ci.layout = pipeline_layout;
7735 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007736 gp_ci.pVertexInputState = &vi_ci;
7737 gp_ci.pInputAssemblyState = &ia_ci;
7738
7739 gp_ci.stageCount = 1;
7740 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007741
7742 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007743 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7744 pc_ci.initialDataSize = 0;
7745 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007746
7747 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007748 VkPipelineCache pipelineCache;
7749
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007750 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007751 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007752 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007753 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007754
Chia-I Wuf7458c52015-10-26 21:10:41 +08007755 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7756 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7757 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7758 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007759}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007760
Tobin Ehlis912df022015-09-17 08:46:18 -06007761/*// TODO : This test should be good, but needs Tess support in compiler to run
7762TEST_F(VkLayerTest, InvalidPatchControlPoints)
7763{
7764 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007765 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007766
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007768 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7769primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007770
Tony Barbour1fa09702017-03-16 12:09:08 -06007771 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007773
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007774 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007775 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007776 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007777
7778 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7779 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7780 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007781 ds_pool_ci.poolSizeCount = 1;
7782 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007783
7784 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007785 err = vkCreateDescriptorPool(m_device->device(),
7786VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007787 ASSERT_VK_SUCCESS(err);
7788
7789 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007790 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007791 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007792 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007793 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7794 dsl_binding.pImmutableSamplers = NULL;
7795
7796 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007797 ds_layout_ci.sType =
7798VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007799 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007800 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007801 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007802
7803 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007804 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7805&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007806 ASSERT_VK_SUCCESS(err);
7807
7808 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007809 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7810VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007811 ASSERT_VK_SUCCESS(err);
7812
7813 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007814 pipeline_layout_ci.sType =
7815VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007816 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007817 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007818 pipeline_layout_ci.pSetLayouts = &ds_layout;
7819
7820 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007821 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7822&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007823 ASSERT_VK_SUCCESS(err);
7824
7825 VkPipelineShaderStageCreateInfo shaderStages[3];
7826 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7827
Karl Schultz6addd812016-02-02 17:17:23 -07007828 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7829this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007830 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007831 VkShaderObj
7832tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7833this);
7834 VkShaderObj
7835te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7836this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007837
Karl Schultz6addd812016-02-02 17:17:23 -07007838 shaderStages[0].sType =
7839VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007840 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007841 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007842 shaderStages[1].sType =
7843VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007844 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007845 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007846 shaderStages[2].sType =
7847VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007848 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007849 shaderStages[2].shader = te.handle();
7850
7851 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007852 iaCI.sType =
7853VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007854 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007855
7856 VkPipelineTessellationStateCreateInfo tsCI = {};
7857 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7858 tsCI.patchControlPoints = 0; // This will cause an error
7859
7860 VkGraphicsPipelineCreateInfo gp_ci = {};
7861 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7862 gp_ci.pNext = NULL;
7863 gp_ci.stageCount = 3;
7864 gp_ci.pStages = shaderStages;
7865 gp_ci.pVertexInputState = NULL;
7866 gp_ci.pInputAssemblyState = &iaCI;
7867 gp_ci.pTessellationState = &tsCI;
7868 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007869 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007870 gp_ci.pMultisampleState = NULL;
7871 gp_ci.pDepthStencilState = NULL;
7872 gp_ci.pColorBlendState = NULL;
7873 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7874 gp_ci.layout = pipeline_layout;
7875 gp_ci.renderPass = renderPass();
7876
7877 VkPipelineCacheCreateInfo pc_ci = {};
7878 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7879 pc_ci.pNext = NULL;
7880 pc_ci.initialSize = 0;
7881 pc_ci.initialData = 0;
7882 pc_ci.maxSize = 0;
7883
7884 VkPipeline pipeline;
7885 VkPipelineCache pipelineCache;
7886
Karl Schultz6addd812016-02-02 17:17:23 -07007887 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7888&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007889 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007890 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7891&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007892
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007893 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007894
Chia-I Wuf7458c52015-10-26 21:10:41 +08007895 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7896 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7897 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7898 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007899}
7900*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007901
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007902TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007903 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007904
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007905 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007906
Tony Barbour1fa09702017-03-16 12:09:08 -06007907 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007908 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007909
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007910 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007911 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7912 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007913
7914 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007915 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7916 ds_pool_ci.maxSets = 1;
7917 ds_pool_ci.poolSizeCount = 1;
7918 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007919
7920 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007921 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007922 ASSERT_VK_SUCCESS(err);
7923
7924 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007925 dsl_binding.binding = 0;
7926 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7927 dsl_binding.descriptorCount = 1;
7928 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007929
7930 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007931 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7932 ds_layout_ci.bindingCount = 1;
7933 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007934
7935 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007936 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007937 ASSERT_VK_SUCCESS(err);
7938
7939 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007940 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007941 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007942 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007943 alloc_info.descriptorPool = ds_pool;
7944 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007945 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007946 ASSERT_VK_SUCCESS(err);
7947
7948 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007949 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7950 pipeline_layout_ci.setLayoutCount = 1;
7951 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007952
7953 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007954 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007955 ASSERT_VK_SUCCESS(err);
7956
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007957 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007958 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007959 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007960 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007961 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007962 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007963
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007964 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7965 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7966 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7967 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7968 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7969 rs_state_ci.depthClampEnable = VK_FALSE;
7970 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7971 rs_state_ci.depthBiasEnable = VK_FALSE;
7972
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007973 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7974 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7975 vi_ci.pNext = nullptr;
7976 vi_ci.vertexBindingDescriptionCount = 0;
7977 vi_ci.pVertexBindingDescriptions = nullptr;
7978 vi_ci.vertexAttributeDescriptionCount = 0;
7979 vi_ci.pVertexAttributeDescriptions = nullptr;
7980
7981 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7982 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7983 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7984
7985 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7986 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7987 pipe_ms_state_ci.pNext = NULL;
7988 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7989 pipe_ms_state_ci.sampleShadingEnable = 0;
7990 pipe_ms_state_ci.minSampleShading = 1.0;
7991 pipe_ms_state_ci.pSampleMask = NULL;
7992
Cody Northropeb3a6c12015-10-05 14:44:45 -06007993 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007994 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007995
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007996 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007997 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007998 shaderStages[0] = vs.GetStageCreateInfo();
7999 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008000
8001 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008002 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8003 gp_ci.stageCount = 2;
8004 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008005 gp_ci.pVertexInputState = &vi_ci;
8006 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008007 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008008 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008009 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008010 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8011 gp_ci.layout = pipeline_layout;
8012 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008013
8014 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008015 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008016
8017 VkPipeline pipeline;
8018 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008019 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008020 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008021
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008022 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008023 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008024
8025 // Check case where multiViewport is disabled and viewport count is not 1
8026 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
8028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
8029 vp_state_ci.scissorCount = 0;
8030 vp_state_ci.viewportCount = 0;
8031 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8032 m_errorMonitor->VerifyFound();
8033 } else {
8034 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008035 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008036 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008037 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008038
8039 // Check is that viewportcount and scissorcount match
8040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
8041 vp_state_ci.scissorCount = 1;
8042 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8043 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8044 m_errorMonitor->VerifyFound();
8045
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008046 // Check case where multiViewport is enabled and viewport count is greater than max
8047 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8050 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8051 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8052 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8053 m_errorMonitor->VerifyFound();
8054 }
8055 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008056
Chia-I Wuf7458c52015-10-26 21:10:41 +08008057 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8058 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8059 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8060 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008061}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008062
8063// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
8064// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008065TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008066 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008067
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008068 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8069
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008071
Tony Barbour1fa09702017-03-16 12:09:08 -06008072 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008074
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008075 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008076 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8077 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008078
8079 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008080 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8081 ds_pool_ci.maxSets = 1;
8082 ds_pool_ci.poolSizeCount = 1;
8083 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008084
8085 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008086 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008087 ASSERT_VK_SUCCESS(err);
8088
8089 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008090 dsl_binding.binding = 0;
8091 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8092 dsl_binding.descriptorCount = 1;
8093 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008094
8095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8097 ds_layout_ci.bindingCount = 1;
8098 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008099
8100 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008101 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008102 ASSERT_VK_SUCCESS(err);
8103
8104 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008105 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008106 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008107 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008108 alloc_info.descriptorPool = ds_pool;
8109 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008110 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008111 ASSERT_VK_SUCCESS(err);
8112
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008113 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8114 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8115 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8116
8117 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8118 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8119 vi_ci.pNext = nullptr;
8120 vi_ci.vertexBindingDescriptionCount = 0;
8121 vi_ci.pVertexBindingDescriptions = nullptr;
8122 vi_ci.vertexAttributeDescriptionCount = 0;
8123 vi_ci.pVertexAttributeDescriptions = nullptr;
8124
8125 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8126 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8127 pipe_ms_state_ci.pNext = NULL;
8128 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8129 pipe_ms_state_ci.sampleShadingEnable = 0;
8130 pipe_ms_state_ci.minSampleShading = 1.0;
8131 pipe_ms_state_ci.pSampleMask = NULL;
8132
Tobin Ehlise68360f2015-10-01 11:15:13 -06008133 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008134 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8135 pipeline_layout_ci.setLayoutCount = 1;
8136 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008137
8138 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008139 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008140 ASSERT_VK_SUCCESS(err);
8141
8142 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8143 // Set scissor as dynamic to avoid second error
8144 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008145 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8146 dyn_state_ci.dynamicStateCount = 1;
8147 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008148
Cody Northropeb3a6c12015-10-05 14:44:45 -06008149 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008150 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008152 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008153 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8154 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008155 shaderStages[0] = vs.GetStageCreateInfo();
8156 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008157
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008158 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8159 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8160 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8161 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8162 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8163 rs_state_ci.depthClampEnable = VK_FALSE;
8164 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8165 rs_state_ci.depthBiasEnable = VK_FALSE;
8166
Tobin Ehlise68360f2015-10-01 11:15:13 -06008167 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008168 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8169 gp_ci.stageCount = 2;
8170 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008171 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008172 // Not setting VP state w/o dynamic vp state should cause validation error
8173 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008174 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008175 gp_ci.pVertexInputState = &vi_ci;
8176 gp_ci.pInputAssemblyState = &ia_ci;
8177 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008178 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8179 gp_ci.layout = pipeline_layout;
8180 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008181
8182 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008183 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008184
8185 VkPipeline pipeline;
8186 VkPipelineCache pipelineCache;
8187
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008188 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008189 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008190 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008191
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008192 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008193
Chia-I Wuf7458c52015-10-26 21:10:41 +08008194 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8195 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8196 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8197 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008198}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008199
8200// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8201// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008202TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8203 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008204
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008206
Tony Barbour1fa09702017-03-16 12:09:08 -06008207 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008208
8209 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008210 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008211 return;
8212 }
8213
Tobin Ehlise68360f2015-10-01 11:15:13 -06008214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008215
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008216 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008217 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8218 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008219
8220 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008221 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8222 ds_pool_ci.maxSets = 1;
8223 ds_pool_ci.poolSizeCount = 1;
8224 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008225
8226 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008227 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008228 ASSERT_VK_SUCCESS(err);
8229
8230 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008231 dsl_binding.binding = 0;
8232 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8233 dsl_binding.descriptorCount = 1;
8234 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008235
8236 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008237 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8238 ds_layout_ci.bindingCount = 1;
8239 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008240
8241 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008242 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008243 ASSERT_VK_SUCCESS(err);
8244
8245 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008246 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008247 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008248 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008249 alloc_info.descriptorPool = ds_pool;
8250 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008251 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008252 ASSERT_VK_SUCCESS(err);
8253
8254 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008255 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8256 pipeline_layout_ci.setLayoutCount = 1;
8257 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008258
8259 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008260 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008261 ASSERT_VK_SUCCESS(err);
8262
8263 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008264 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8265 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008266 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008267 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008268 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008269
8270 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8271 // Set scissor as dynamic to avoid that error
8272 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008273 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8274 dyn_state_ci.dynamicStateCount = 1;
8275 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008276
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008277 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8278 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8279 pipe_ms_state_ci.pNext = NULL;
8280 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8281 pipe_ms_state_ci.sampleShadingEnable = 0;
8282 pipe_ms_state_ci.minSampleShading = 1.0;
8283 pipe_ms_state_ci.pSampleMask = NULL;
8284
Cody Northropeb3a6c12015-10-05 14:44:45 -06008285 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008286 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008288 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008289 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8290 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008291 shaderStages[0] = vs.GetStageCreateInfo();
8292 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008293
Cody Northropf6622dc2015-10-06 10:33:21 -06008294 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8295 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8296 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008297 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008298 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008299 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008300 vi_ci.pVertexAttributeDescriptions = nullptr;
8301
8302 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8303 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8304 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8305
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008306 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008307 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008308 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008309 rs_ci.pNext = nullptr;
8310
Mark Youngc89c6312016-03-31 16:03:20 -06008311 VkPipelineColorBlendAttachmentState att = {};
8312 att.blendEnable = VK_FALSE;
8313 att.colorWriteMask = 0xf;
8314
Cody Northropf6622dc2015-10-06 10:33:21 -06008315 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8316 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8317 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008318 cb_ci.attachmentCount = 1;
8319 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008320
Tobin Ehlise68360f2015-10-01 11:15:13 -06008321 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008322 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8323 gp_ci.stageCount = 2;
8324 gp_ci.pStages = shaderStages;
8325 gp_ci.pVertexInputState = &vi_ci;
8326 gp_ci.pInputAssemblyState = &ia_ci;
8327 gp_ci.pViewportState = &vp_state_ci;
8328 gp_ci.pRasterizationState = &rs_ci;
8329 gp_ci.pColorBlendState = &cb_ci;
8330 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008331 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008332 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8333 gp_ci.layout = pipeline_layout;
8334 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008335
8336 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008337 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008338
8339 VkPipeline pipeline;
8340 VkPipelineCache pipelineCache;
8341
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008342 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008343 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008344 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008345
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008346 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008347
Tobin Ehlisd332f282015-10-02 11:00:56 -06008348 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008349 // First need to successfully create the PSO from above by setting
8350 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, ");
Karl Schultz6addd812016-02-02 17:17:23 -07008352
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008353 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008354 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008355 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008356 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008357 m_commandBuffer->BeginCommandBuffer();
8358 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008359 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008360 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008361 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008362 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008363 Draw(1, 0, 0, 0);
8364
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008365 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008366
8367 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8368 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8370 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008371 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008372}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008373
8374// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008375// viewportCount
8376TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8377 VkResult err;
8378
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008380
Tony Barbour1fa09702017-03-16 12:09:08 -06008381 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008382
8383 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008384 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008385 return;
8386 }
8387
Karl Schultz6addd812016-02-02 17:17:23 -07008388 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8389
8390 VkDescriptorPoolSize ds_type_count = {};
8391 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8392 ds_type_count.descriptorCount = 1;
8393
8394 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8395 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8396 ds_pool_ci.maxSets = 1;
8397 ds_pool_ci.poolSizeCount = 1;
8398 ds_pool_ci.pPoolSizes = &ds_type_count;
8399
8400 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008401 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008402 ASSERT_VK_SUCCESS(err);
8403
8404 VkDescriptorSetLayoutBinding dsl_binding = {};
8405 dsl_binding.binding = 0;
8406 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8407 dsl_binding.descriptorCount = 1;
8408 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8409
8410 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8411 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8412 ds_layout_ci.bindingCount = 1;
8413 ds_layout_ci.pBindings = &dsl_binding;
8414
8415 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008416 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008417 ASSERT_VK_SUCCESS(err);
8418
8419 VkDescriptorSet descriptorSet;
8420 VkDescriptorSetAllocateInfo alloc_info = {};
8421 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8422 alloc_info.descriptorSetCount = 1;
8423 alloc_info.descriptorPool = ds_pool;
8424 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008425 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008426 ASSERT_VK_SUCCESS(err);
8427
8428 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8429 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8430 pipeline_layout_ci.setLayoutCount = 1;
8431 pipeline_layout_ci.pSetLayouts = &ds_layout;
8432
8433 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008434 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008435 ASSERT_VK_SUCCESS(err);
8436
8437 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8438 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8439 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008440 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008441 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008442 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008443
8444 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8445 // Set scissor as dynamic to avoid that error
8446 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8447 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8448 dyn_state_ci.dynamicStateCount = 1;
8449 dyn_state_ci.pDynamicStates = &vp_state;
8450
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008451 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8452 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8453 pipe_ms_state_ci.pNext = NULL;
8454 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8455 pipe_ms_state_ci.sampleShadingEnable = 0;
8456 pipe_ms_state_ci.minSampleShading = 1.0;
8457 pipe_ms_state_ci.pSampleMask = NULL;
8458
Karl Schultz6addd812016-02-02 17:17:23 -07008459 VkPipelineShaderStageCreateInfo shaderStages[2];
8460 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8461
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008462 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008463 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8464 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07008465 shaderStages[0] = vs.GetStageCreateInfo();
8466 shaderStages[1] = fs.GetStageCreateInfo();
8467
8468 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8469 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8470 vi_ci.pNext = nullptr;
8471 vi_ci.vertexBindingDescriptionCount = 0;
8472 vi_ci.pVertexBindingDescriptions = nullptr;
8473 vi_ci.vertexAttributeDescriptionCount = 0;
8474 vi_ci.pVertexAttributeDescriptions = nullptr;
8475
8476 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8477 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8478 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8479
8480 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8481 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008482 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008483 rs_ci.pNext = nullptr;
8484
Mark Youngc89c6312016-03-31 16:03:20 -06008485 VkPipelineColorBlendAttachmentState att = {};
8486 att.blendEnable = VK_FALSE;
8487 att.colorWriteMask = 0xf;
8488
Karl Schultz6addd812016-02-02 17:17:23 -07008489 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8490 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8491 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008492 cb_ci.attachmentCount = 1;
8493 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008494
8495 VkGraphicsPipelineCreateInfo gp_ci = {};
8496 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8497 gp_ci.stageCount = 2;
8498 gp_ci.pStages = shaderStages;
8499 gp_ci.pVertexInputState = &vi_ci;
8500 gp_ci.pInputAssemblyState = &ia_ci;
8501 gp_ci.pViewportState = &vp_state_ci;
8502 gp_ci.pRasterizationState = &rs_ci;
8503 gp_ci.pColorBlendState = &cb_ci;
8504 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008505 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008506 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8507 gp_ci.layout = pipeline_layout;
8508 gp_ci.renderPass = renderPass();
8509
8510 VkPipelineCacheCreateInfo pc_ci = {};
8511 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8512
8513 VkPipeline pipeline;
8514 VkPipelineCache pipelineCache;
8515
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008516 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008517 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008518 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008519
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008520 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008521
8522 // Now hit second fail case where we set scissor w/ different count than PSO
8523 // First need to successfully create the PSO from above by setting
8524 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8526 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008527
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008528 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008529 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008530 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008531 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008532 m_commandBuffer->BeginCommandBuffer();
8533 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008534 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008535 VkViewport viewports[1] = {};
8536 viewports[0].width = 8;
8537 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008538 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008539 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008540 Draw(1, 0, 0, 0);
8541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008542 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008543
Chia-I Wuf7458c52015-10-26 21:10:41 +08008544 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8545 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8546 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8547 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008548 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008549}
8550
Mark Young7394fdd2016-03-31 14:56:43 -06008551TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8552 VkResult err;
8553
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008555
Tony Barbour1fa09702017-03-16 12:09:08 -06008556 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8558
8559 VkDescriptorPoolSize ds_type_count = {};
8560 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8561 ds_type_count.descriptorCount = 1;
8562
8563 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8564 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8565 ds_pool_ci.maxSets = 1;
8566 ds_pool_ci.poolSizeCount = 1;
8567 ds_pool_ci.pPoolSizes = &ds_type_count;
8568
8569 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008570 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008571 ASSERT_VK_SUCCESS(err);
8572
8573 VkDescriptorSetLayoutBinding dsl_binding = {};
8574 dsl_binding.binding = 0;
8575 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8576 dsl_binding.descriptorCount = 1;
8577 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8578
8579 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8580 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8581 ds_layout_ci.bindingCount = 1;
8582 ds_layout_ci.pBindings = &dsl_binding;
8583
8584 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008585 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008586 ASSERT_VK_SUCCESS(err);
8587
8588 VkDescriptorSet descriptorSet;
8589 VkDescriptorSetAllocateInfo alloc_info = {};
8590 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8591 alloc_info.descriptorSetCount = 1;
8592 alloc_info.descriptorPool = ds_pool;
8593 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008594 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008595 ASSERT_VK_SUCCESS(err);
8596
8597 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8598 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8599 pipeline_layout_ci.setLayoutCount = 1;
8600 pipeline_layout_ci.pSetLayouts = &ds_layout;
8601
8602 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008603 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008604 ASSERT_VK_SUCCESS(err);
8605
8606 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8607 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8608 vp_state_ci.scissorCount = 1;
8609 vp_state_ci.pScissors = NULL;
8610 vp_state_ci.viewportCount = 1;
8611 vp_state_ci.pViewports = NULL;
8612
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008613 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008614 // Set scissor as dynamic to avoid that error
8615 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8616 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8617 dyn_state_ci.dynamicStateCount = 2;
8618 dyn_state_ci.pDynamicStates = dynamic_states;
8619
8620 VkPipelineShaderStageCreateInfo shaderStages[2];
8621 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8622
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008623 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8624 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008625 this); // TODO - We shouldn't need a fragment shader
8626 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008627 shaderStages[0] = vs.GetStageCreateInfo();
8628 shaderStages[1] = fs.GetStageCreateInfo();
8629
8630 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8631 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8632 vi_ci.pNext = nullptr;
8633 vi_ci.vertexBindingDescriptionCount = 0;
8634 vi_ci.pVertexBindingDescriptions = nullptr;
8635 vi_ci.vertexAttributeDescriptionCount = 0;
8636 vi_ci.pVertexAttributeDescriptions = nullptr;
8637
8638 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8639 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8640 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8641
8642 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8643 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8644 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008645 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008646
Mark Young47107952016-05-02 15:59:55 -06008647 // Check too low (line width of -1.0f).
8648 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008649
8650 VkPipelineColorBlendAttachmentState att = {};
8651 att.blendEnable = VK_FALSE;
8652 att.colorWriteMask = 0xf;
8653
8654 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8655 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8656 cb_ci.pNext = nullptr;
8657 cb_ci.attachmentCount = 1;
8658 cb_ci.pAttachments = &att;
8659
8660 VkGraphicsPipelineCreateInfo gp_ci = {};
8661 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8662 gp_ci.stageCount = 2;
8663 gp_ci.pStages = shaderStages;
8664 gp_ci.pVertexInputState = &vi_ci;
8665 gp_ci.pInputAssemblyState = &ia_ci;
8666 gp_ci.pViewportState = &vp_state_ci;
8667 gp_ci.pRasterizationState = &rs_ci;
8668 gp_ci.pColorBlendState = &cb_ci;
8669 gp_ci.pDynamicState = &dyn_state_ci;
8670 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8671 gp_ci.layout = pipeline_layout;
8672 gp_ci.renderPass = renderPass();
8673
8674 VkPipelineCacheCreateInfo pc_ci = {};
8675 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8676
8677 VkPipeline pipeline;
8678 VkPipelineCache pipelineCache;
8679
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008680 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008681 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008682 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008683
8684 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008685 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008686
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008688
8689 // Check too high (line width of 65536.0f).
8690 rs_ci.lineWidth = 65536.0f;
8691
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008692 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008693 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008694 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008695
8696 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008697 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008698
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008700
8701 dyn_state_ci.dynamicStateCount = 3;
8702
8703 rs_ci.lineWidth = 1.0f;
8704
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008705 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008706 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008707 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008708 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008709 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008710
8711 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008712 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008713 m_errorMonitor->VerifyFound();
8714
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008716
8717 // Check too high with dynamic setting.
8718 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8719 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008720 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008721
8722 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8723 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8724 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8725 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008726 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008727}
8728
Karl Schultz6addd812016-02-02 17:17:23 -07008729TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008730 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008732 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008733
Tony Barbour1fa09702017-03-16 12:09:08 -06008734 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008736
Tony Barbour552f6c02016-12-21 14:34:07 -07008737 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008738 // Don't care about RenderPass handle b/c error should be flagged before
8739 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008740 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008741
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008742 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008743}
8744
Karl Schultz6addd812016-02-02 17:17:23 -07008745TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008746 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8748 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008749
Tony Barbour1fa09702017-03-16 12:09:08 -06008750 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008751 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008752
Tony Barbour552f6c02016-12-21 14:34:07 -07008753 m_commandBuffer->BeginCommandBuffer();
8754 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008755 // Just create a dummy Renderpass that's non-NULL so we can get to the
8756 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008757 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008758
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008759 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008760}
8761
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008762TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008763 TEST_DESCRIPTION(
8764 "Begin a renderPass where clearValueCount is less than"
8765 "the number of renderPass attachments that use loadOp"
8766 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008767
Tony Barbour1fa09702017-03-16 12:09:08 -06008768 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008769 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8770
8771 // Create a renderPass with a single attachment that uses loadOp CLEAR
8772 VkAttachmentReference attach = {};
8773 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8774 VkSubpassDescription subpass = {};
8775 subpass.inputAttachmentCount = 1;
8776 subpass.pInputAttachments = &attach;
8777 VkRenderPassCreateInfo rpci = {};
8778 rpci.subpassCount = 1;
8779 rpci.pSubpasses = &subpass;
8780 rpci.attachmentCount = 1;
8781 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008782 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008783 // Set loadOp to CLEAR
8784 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8785 rpci.pAttachments = &attach_desc;
8786 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8787 VkRenderPass rp;
8788 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8789
8790 VkCommandBufferInheritanceInfo hinfo = {};
8791 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8792 hinfo.renderPass = VK_NULL_HANDLE;
8793 hinfo.subpass = 0;
8794 hinfo.framebuffer = VK_NULL_HANDLE;
8795 hinfo.occlusionQueryEnable = VK_FALSE;
8796 hinfo.queryFlags = 0;
8797 hinfo.pipelineStatistics = 0;
8798 VkCommandBufferBeginInfo info = {};
8799 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8800 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8801 info.pInheritanceInfo = &hinfo;
8802
8803 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8804 VkRenderPassBeginInfo rp_begin = {};
8805 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8806 rp_begin.pNext = NULL;
8807 rp_begin.renderPass = renderPass();
8808 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008809 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008810
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008812
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008813 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008814
8815 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008816
8817 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008818}
8819
Slawomir Cygan0808f392016-11-28 17:53:23 +01008820TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008821 TEST_DESCRIPTION(
8822 "Begin a renderPass where clearValueCount is greater than"
8823 "the number of renderPass attachments that use loadOp"
8824 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008825
Tony Barbour1fa09702017-03-16 12:09:08 -06008826 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008827 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8828
8829 // Create a renderPass with a single attachment that uses loadOp CLEAR
8830 VkAttachmentReference attach = {};
8831 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8832 VkSubpassDescription subpass = {};
8833 subpass.inputAttachmentCount = 1;
8834 subpass.pInputAttachments = &attach;
8835 VkRenderPassCreateInfo rpci = {};
8836 rpci.subpassCount = 1;
8837 rpci.pSubpasses = &subpass;
8838 rpci.attachmentCount = 1;
8839 VkAttachmentDescription attach_desc = {};
8840 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8841 // Set loadOp to CLEAR
8842 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8843 rpci.pAttachments = &attach_desc;
8844 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8845 VkRenderPass rp;
8846 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8847
8848 VkCommandBufferBeginInfo info = {};
8849 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8850 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8851
8852 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8853 VkRenderPassBeginInfo rp_begin = {};
8854 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8855 rp_begin.pNext = NULL;
8856 rp_begin.renderPass = renderPass();
8857 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008858 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008859
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8861 " has a clearValueCount of"
8862 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008863
8864 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8865
8866 m_errorMonitor->VerifyFound();
8867
8868 vkDestroyRenderPass(m_device->device(), rp, NULL);
8869}
8870
Cody Northrop3bb4d962016-05-09 16:15:57 -06008871TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008872 TEST_DESCRIPTION("End a command buffer with an active render pass");
8873
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8875 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008876
Tony Barbour1fa09702017-03-16 12:09:08 -06008877 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008878 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8879
Tony Barbour552f6c02016-12-21 14:34:07 -07008880 m_commandBuffer->BeginCommandBuffer();
8881 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8882 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008883
8884 m_errorMonitor->VerifyFound();
8885
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008886 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8887 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008888}
8889
Karl Schultz6addd812016-02-02 17:17:23 -07008890TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008891 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8893 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008894
Tony Barbour1fa09702017-03-16 12:09:08 -06008895 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008897
Tony Barbour552f6c02016-12-21 14:34:07 -07008898 m_commandBuffer->BeginCommandBuffer();
8899 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008900
8901 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008902 vk_testing::Buffer dstBuffer;
8903 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008904
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008905 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008906
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008907 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008908}
8909
Karl Schultz6addd812016-02-02 17:17:23 -07008910TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008911 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8913 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008914
Tony Barbour1fa09702017-03-16 12:09:08 -06008915 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008916 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008917
Tony Barbour552f6c02016-12-21 14:34:07 -07008918 m_commandBuffer->BeginCommandBuffer();
8919 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008920
8921 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008922 vk_testing::Buffer dstBuffer;
8923 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008924
Karl Schultz6addd812016-02-02 17:17:23 -07008925 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008926 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8927 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8928 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008929
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008930 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008931}
8932
Karl Schultz6addd812016-02-02 17:17:23 -07008933TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008934 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8936 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008937
Tony Barbour1fa09702017-03-16 12:09:08 -06008938 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008940
Tony Barbour552f6c02016-12-21 14:34:07 -07008941 m_commandBuffer->BeginCommandBuffer();
8942 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008943
Michael Lentine0a369f62016-02-03 16:51:46 -06008944 VkClearColorValue clear_color;
8945 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008946 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8947 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8948 const int32_t tex_width = 32;
8949 const int32_t tex_height = 32;
8950 VkImageCreateInfo image_create_info = {};
8951 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8952 image_create_info.pNext = NULL;
8953 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8954 image_create_info.format = tex_format;
8955 image_create_info.extent.width = tex_width;
8956 image_create_info.extent.height = tex_height;
8957 image_create_info.extent.depth = 1;
8958 image_create_info.mipLevels = 1;
8959 image_create_info.arrayLayers = 1;
8960 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8961 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008962 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008963
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008964 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008965 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008966
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008967 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008968
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008969 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008970
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008971 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008972}
8973
Karl Schultz6addd812016-02-02 17:17:23 -07008974TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008975 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8977 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008978
Tony Barbour1fa09702017-03-16 12:09:08 -06008979 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008981
Dave Houlton1d2022c2017-03-29 11:43:58 -06008982 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008983 if (!depth_format) {
8984 printf(" No Depth + Stencil format found. Skipped.\n");
8985 return;
8986 }
8987
Tony Barbour552f6c02016-12-21 14:34:07 -07008988 m_commandBuffer->BeginCommandBuffer();
8989 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008990
8991 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008992 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008993 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8994 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008995 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008996 image_create_info.extent.width = 64;
8997 image_create_info.extent.height = 64;
8998 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8999 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009000
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009001 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009002 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009003
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009004 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009005
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009006 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9007 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009008
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009009 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009010}
9011
Karl Schultz6addd812016-02-02 17:17:23 -07009012TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009013 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009014 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009015
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9017 "vkCmdClearAttachments(): This call "
9018 "must be issued inside an active "
9019 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009020
Tony Barbour1fa09702017-03-16 12:09:08 -06009021 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009022 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009023
9024 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009025 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009026 ASSERT_VK_SUCCESS(err);
9027
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009028 VkClearAttachment color_attachment;
9029 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9030 color_attachment.clearValue.color.float32[0] = 0;
9031 color_attachment.clearValue.color.float32[1] = 0;
9032 color_attachment.clearValue.color.float32[2] = 0;
9033 color_attachment.clearValue.color.float32[3] = 0;
9034 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009035 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009036 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009037
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009038 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009039}
9040
Chris Forbes3b97e932016-09-07 11:29:24 +12009041TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009042 TEST_DESCRIPTION(
9043 "Test that an error is produced when CmdNextSubpass is "
9044 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009045
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9047 "vkCmdNextSubpass(): Attempted to advance "
9048 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009049
Tony Barbour1fa09702017-03-16 12:09:08 -06009050 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009051 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9052
Tony Barbour552f6c02016-12-21 14:34:07 -07009053 m_commandBuffer->BeginCommandBuffer();
9054 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009055
9056 // error here.
9057 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9058 m_errorMonitor->VerifyFound();
9059
Tony Barbour552f6c02016-12-21 14:34:07 -07009060 m_commandBuffer->EndRenderPass();
9061 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009062}
9063
Chris Forbes6d624702016-09-07 13:57:05 +12009064TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009065 TEST_DESCRIPTION(
9066 "Test that an error is produced when CmdEndRenderPass is "
9067 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009068
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9070 "vkCmdEndRenderPass(): Called before reaching "
9071 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009072
Tony Barbour1fa09702017-03-16 12:09:08 -06009073 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009074 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9075 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009077 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009078
9079 VkRenderPass rp;
9080 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9081 ASSERT_VK_SUCCESS(err);
9082
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009083 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009084
9085 VkFramebuffer fb;
9086 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9087 ASSERT_VK_SUCCESS(err);
9088
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009089 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009090
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009091 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {16, 16}}, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009092
9093 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9094
9095 // Error here.
9096 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9097 m_errorMonitor->VerifyFound();
9098
9099 // Clean up.
9100 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9101 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9102}
9103
Karl Schultz9e66a292016-04-21 15:57:51 -06009104TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9105 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9107 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009108
Tony Barbour1fa09702017-03-16 12:09:08 -06009109 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009110 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009111
9112 VkBufferMemoryBarrier buf_barrier = {};
9113 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9114 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9115 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9116 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9117 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9118 buf_barrier.buffer = VK_NULL_HANDLE;
9119 buf_barrier.offset = 0;
9120 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009121 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9122 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009123
9124 m_errorMonitor->VerifyFound();
9125}
9126
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009127TEST_F(VkLayerTest, InvalidBarriers) {
9128 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9129
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009131
Tony Barbour1fa09702017-03-16 12:09:08 -06009132 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009133 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009134 if (!depth_format) {
9135 printf(" No Depth + Stencil format found. Skipped.\n");
9136 return;
9137 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009138 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9139
9140 VkMemoryBarrier mem_barrier = {};
9141 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9142 mem_barrier.pNext = NULL;
9143 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9144 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009145 m_commandBuffer->BeginCommandBuffer();
9146 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009147 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009148 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009149 &mem_barrier, 0, nullptr, 0, nullptr);
9150 m_errorMonitor->VerifyFound();
9151
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009153 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009154 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009155 ASSERT_TRUE(image.initialized());
9156 VkImageMemoryBarrier img_barrier = {};
9157 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9158 img_barrier.pNext = NULL;
9159 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9160 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9161 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9162 // New layout can't be UNDEFINED
9163 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9164 img_barrier.image = image.handle();
9165 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9166 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9167 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9168 img_barrier.subresourceRange.baseArrayLayer = 0;
9169 img_barrier.subresourceRange.baseMipLevel = 0;
9170 img_barrier.subresourceRange.layerCount = 1;
9171 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009172 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9173 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009174 m_errorMonitor->VerifyFound();
9175 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9176
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9178 "Subresource must have the sum of the "
9179 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009180 // baseArrayLayer + layerCount must be <= image's arrayLayers
9181 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009182 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9183 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009184 m_errorMonitor->VerifyFound();
9185 img_barrier.subresourceRange.baseArrayLayer = 0;
9186
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009188 // baseMipLevel + levelCount must be <= image's mipLevels
9189 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009190 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9191 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009192 m_errorMonitor->VerifyFound();
9193 img_barrier.subresourceRange.baseMipLevel = 0;
9194
Mike Weiblen7053aa32017-01-25 15:21:10 -07009195 // levelCount must be non-zero.
9196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9197 img_barrier.subresourceRange.levelCount = 0;
9198 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9199 nullptr, 0, nullptr, 1, &img_barrier);
9200 m_errorMonitor->VerifyFound();
9201 img_barrier.subresourceRange.levelCount = 1;
9202
9203 // layerCount must be non-zero.
9204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9205 img_barrier.subresourceRange.layerCount = 0;
9206 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9207 nullptr, 0, nullptr, 1, &img_barrier);
9208 m_errorMonitor->VerifyFound();
9209 img_barrier.subresourceRange.layerCount = 1;
9210
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer Barriers cannot be used during a render pass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009212 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009213 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9214 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009215 VkBufferMemoryBarrier buf_barrier = {};
9216 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9217 buf_barrier.pNext = NULL;
9218 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9219 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9220 buf_barrier.buffer = buffer.handle();
9221 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9222 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9223 buf_barrier.offset = 0;
9224 buf_barrier.size = VK_WHOLE_SIZE;
9225 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009226 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9227 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009228 m_errorMonitor->VerifyFound();
9229 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9230
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009232 buf_barrier.offset = 257;
9233 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009234 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9235 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009236 m_errorMonitor->VerifyFound();
9237 buf_barrier.offset = 0;
9238
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009240 buf_barrier.size = 257;
9241 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009242 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9243 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009244 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009245
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009246 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
9248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009249 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009250 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009251 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009252 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9253 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009254 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009255
9256 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009257 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009258 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9259 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009260 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009261
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009262 // Having only one of depth or stencil set for DS image is an error
9263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
9264 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
9265 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9266 nullptr, 0, nullptr, 1, &img_barrier);
9267 m_errorMonitor->VerifyFound();
9268
9269 // Having anything other than DEPTH and STENCIL is an error
9270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Dave Houltonfbf52152017-01-06 12:55:29 -07009271 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9272 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9273 nullptr, 0, nullptr, 1, &img_barrier);
9274 m_errorMonitor->VerifyFound();
9275
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009276 // Now test depth-only
9277 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009278 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9279 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009280 VkDepthStencilObj d_image(m_device);
9281 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9282 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009283 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009284 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009285 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009286
9287 // DEPTH bit must be set
9288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9289 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009290 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009291 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9292 0, nullptr, 0, nullptr, 1, &img_barrier);
9293 m_errorMonitor->VerifyFound();
9294
9295 // No bits other than DEPTH may be set
9296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9297 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9298 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009299 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9300 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009301 m_errorMonitor->VerifyFound();
9302 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009303
9304 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009305 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9306 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009307 VkDepthStencilObj s_image(m_device);
9308 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9309 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009310 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009311 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009312 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009313 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9315 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009316 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009317 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9318 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009319 m_errorMonitor->VerifyFound();
9320 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009321
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009322 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009323 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009324 c_image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009325 ASSERT_TRUE(c_image.initialized());
9326 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9327 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9328 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009329
9330 // COLOR bit must be set
9331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9332 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009333 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009334 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9335 nullptr, 0, nullptr, 1, &img_barrier);
9336 m_errorMonitor->VerifyFound();
9337
9338 // No bits other than COLOR may be set
9339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9340 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9341 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009342 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9343 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009344 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009345
Mike Weiblene6e01172017-03-07 22:18:40 -07009346 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9347 {
9348 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009349 img_color.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009350 ASSERT_TRUE(img_color.initialized());
9351
9352 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009353 img_ds.Init(128, 128, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009354 ASSERT_TRUE(img_ds.initialized());
9355
9356 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009357 img_xfer_src.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009358 ASSERT_TRUE(img_xfer_src.initialized());
9359
9360 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009361 img_xfer_dst.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009362 ASSERT_TRUE(img_xfer_dst.initialized());
9363
9364 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009365 img_sampled.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009366 ASSERT_TRUE(img_sampled.initialized());
9367
9368 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009369 img_input.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009370 ASSERT_TRUE(img_input.initialized());
9371
9372 const struct {
9373 VkImageObj &image_obj;
9374 VkImageLayout bad_layout;
9375 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9376 } bad_buffer_layouts[] = {
9377 // clang-format off
9378 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9379 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9380 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9381 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9382 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9383 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9384 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9385 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9386 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9387 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9388 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9389 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9390 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9391 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9392 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9393 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9394 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9395 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9396 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9397 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9398 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9399 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9400 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9401 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9402 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9403 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9404 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9405 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9406 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9407 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9408 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9409 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9410 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9411 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9412 // clang-format on
9413 };
9414 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9415
9416 for (uint32_t i = 0; i < layout_count; ++i) {
9417 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9418 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9419 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9420 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9421 : VK_IMAGE_ASPECT_COLOR_BIT;
9422
9423 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9424 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9426 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9427 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9428 m_errorMonitor->VerifyFound();
9429
9430 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9431 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9433 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9434 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9435 m_errorMonitor->VerifyFound();
9436 }
9437
9438 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9439 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9440 }
9441
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009442 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9443
9444 // Create command pool with incompatible queueflags
9445 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009446 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009447 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009448 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009449 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009450 }
9451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9452
9453 VkCommandPool command_pool;
9454 VkCommandPoolCreateInfo pool_create_info{};
9455 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9456 pool_create_info.queueFamilyIndex = queue_family_index;
9457 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9458 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9459
9460 // Allocate a command buffer
9461 VkCommandBuffer bad_command_buffer;
9462 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9463 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9464 command_buffer_allocate_info.commandPool = command_pool;
9465 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9466 command_buffer_allocate_info.commandBufferCount = 1;
9467 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9468
9469 VkCommandBufferBeginInfo cbbi = {};
9470 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9471 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9472 buf_barrier.offset = 0;
9473 buf_barrier.size = VK_WHOLE_SIZE;
9474 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9475 &buf_barrier, 0, nullptr);
9476 m_errorMonitor->VerifyFound();
9477
9478 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9479 vkEndCommandBuffer(bad_command_buffer);
9480 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009481 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009482 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009483 }
9484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9485 VkEvent event;
9486 VkEventCreateInfo event_create_info{};
9487 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9488 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9489 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9490 nullptr, 0, nullptr);
9491 m_errorMonitor->VerifyFound();
9492
9493 vkEndCommandBuffer(bad_command_buffer);
9494 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009495}
9496
Tony Barbour18ba25c2016-09-29 13:42:40 -06009497TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9498 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9499
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009501 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009502 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009503 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 -07009504 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009505 ASSERT_TRUE(image.initialized());
9506
9507 VkImageMemoryBarrier barrier = {};
9508 VkImageSubresourceRange range;
9509 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9510 barrier.srcAccessMask = 0;
9511 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9512 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9513 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9514 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9515 barrier.image = image.handle();
9516 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9517 range.baseMipLevel = 0;
9518 range.levelCount = 1;
9519 range.baseArrayLayer = 0;
9520 range.layerCount = 1;
9521 barrier.subresourceRange = range;
9522 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9523 cmdbuf.BeginCommandBuffer();
9524 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9525 &barrier);
9526 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9527 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9528 barrier.srcAccessMask = 0;
9529 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9530 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9531 &barrier);
9532
9533 m_errorMonitor->VerifyFound();
9534}
9535
Karl Schultz6addd812016-02-02 17:17:23 -07009536TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009537 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009538 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009539 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009540
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009541 uint32_t const indices[] = {0};
9542 VkBufferCreateInfo buf_info = {};
9543 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9544 buf_info.size = 1024;
9545 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9546 buf_info.queueFamilyIndexCount = 1;
9547 buf_info.pQueueFamilyIndices = indices;
9548
9549 VkBuffer buffer;
9550 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9551 ASSERT_VK_SUCCESS(err);
9552
9553 VkMemoryRequirements requirements;
9554 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9555
9556 VkMemoryAllocateInfo alloc_info{};
9557 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9558 alloc_info.pNext = NULL;
9559 alloc_info.memoryTypeIndex = 0;
9560 alloc_info.allocationSize = requirements.size;
9561 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9562 ASSERT_TRUE(pass);
9563
9564 VkDeviceMemory memory;
9565 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9566 ASSERT_VK_SUCCESS(err);
9567
9568 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009569 ASSERT_VK_SUCCESS(err);
9570
Tony Barbour552f6c02016-12-21 14:34:07 -07009571 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009572 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009573
Karl Schultz6addd812016-02-02 17:17:23 -07009574 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9575 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009576 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9578 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009579 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009580
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009581 vkFreeMemory(m_device->device(), memory, NULL);
9582 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009583}
9584
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009585TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9586 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009587 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009588 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9589 VkBufferCreateInfo buffCI = {};
9590 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9591 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009592 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009593 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009594 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009595 uint32_t qfi[2];
9596 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009597 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009598
9599 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009600 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009601
9602 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9604 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9605 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009606 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009607 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009608
9609 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009610 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9612
9613 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9614 buffCI.queueFamilyIndexCount = 2;
9615 qfi[0] = 1;
9616 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009617 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009618 VkDeviceMemory mem;
9619 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009620 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009621
9622 VkMemoryAllocateInfo alloc_info = {};
9623 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9624 alloc_info.allocationSize = 1024;
9625 bool pass = false;
9626 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9627 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009628 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009629 return;
9630 }
9631 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009632 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009633
9634 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009635 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009636 m_commandBuffer->end();
9637 QueueCommandBuffer(false);
9638 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009639 vkDestroyBuffer(m_device->device(), ib2, NULL);
9640 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009641 }
9642
Tony Barbourdf4c0042016-06-01 15:55:43 -06009643 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009644}
9645
Karl Schultz6addd812016-02-02 17:17:23 -07009646TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009647 TEST_DESCRIPTION(
9648 "Attempt vkCmdExecuteCommands with a primary command buffer"
9649 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009650
Tony Barbour1fa09702017-03-16 12:09:08 -06009651 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009652 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009653
Chris Forbesf29a84f2016-10-06 18:39:28 +13009654 // An empty primary command buffer
9655 VkCommandBufferObj cb(m_device, m_commandPool);
9656 cb.BeginCommandBuffer();
9657 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009658
Chris Forbesf29a84f2016-10-06 18:39:28 +13009659 m_commandBuffer->BeginCommandBuffer();
9660 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9661 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009662
Chris Forbesf29a84f2016-10-06 18:39:28 +13009663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9664 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009665 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009666
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -06009667 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009668}
9669
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009670TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009671 TEST_DESCRIPTION(
9672 "Attempt to update descriptor sets for images and buffers "
9673 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009674 VkResult err;
9675
Tony Barbour1fa09702017-03-16 12:09:08 -06009676 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009677 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9678 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9679 ds_type_count[i].type = VkDescriptorType(i);
9680 ds_type_count[i].descriptorCount = 1;
9681 }
9682 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9683 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9684 ds_pool_ci.pNext = NULL;
9685 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9686 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9687 ds_pool_ci.pPoolSizes = ds_type_count;
9688
9689 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009690 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009691 ASSERT_VK_SUCCESS(err);
9692
9693 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009694 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009695 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9696 dsl_binding[i].binding = 0;
9697 dsl_binding[i].descriptorType = VkDescriptorType(i);
9698 dsl_binding[i].descriptorCount = 1;
9699 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9700 dsl_binding[i].pImmutableSamplers = NULL;
9701 }
9702
9703 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9704 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9705 ds_layout_ci.pNext = NULL;
9706 ds_layout_ci.bindingCount = 1;
9707 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9708 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9709 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009710 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009711 ASSERT_VK_SUCCESS(err);
9712 }
9713 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9714 VkDescriptorSetAllocateInfo alloc_info = {};
9715 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9716 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9717 alloc_info.descriptorPool = ds_pool;
9718 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009719 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009720 ASSERT_VK_SUCCESS(err);
9721
9722 // Create a buffer & bufferView to be used for invalid updates
9723 VkBufferCreateInfo buff_ci = {};
9724 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009725 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009726 buff_ci.size = 256;
9727 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009728 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009729 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9730 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009731
9732 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9733 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9734 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9735 ASSERT_VK_SUCCESS(err);
9736
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009737 VkMemoryRequirements mem_reqs;
9738 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9739 VkMemoryAllocateInfo mem_alloc_info = {};
9740 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9741 mem_alloc_info.pNext = NULL;
9742 mem_alloc_info.memoryTypeIndex = 0;
9743 mem_alloc_info.allocationSize = mem_reqs.size;
9744 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9745 if (!pass) {
9746 vkDestroyBuffer(m_device->device(), buffer, NULL);
9747 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9748 return;
9749 }
9750 VkDeviceMemory mem;
9751 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9752 ASSERT_VK_SUCCESS(err);
9753 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9754 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009755
9756 VkBufferViewCreateInfo buff_view_ci = {};
9757 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9758 buff_view_ci.buffer = buffer;
9759 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9760 buff_view_ci.range = VK_WHOLE_SIZE;
9761 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009762 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009763 ASSERT_VK_SUCCESS(err);
9764
Tony Barbour415497c2017-01-24 10:06:09 -07009765 // Now get resources / view for storage_texel_buffer
9766 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9767 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9768 if (!pass) {
9769 vkDestroyBuffer(m_device->device(), buffer, NULL);
9770 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9771 vkFreeMemory(m_device->device(), mem, NULL);
9772 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9773 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9774 return;
9775 }
9776 VkDeviceMemory storage_texel_buffer_mem;
9777 VkBufferView storage_texel_buffer_view;
9778 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9779 ASSERT_VK_SUCCESS(err);
9780 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9781 ASSERT_VK_SUCCESS(err);
9782 buff_view_ci.buffer = storage_texel_buffer;
9783 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9784 ASSERT_VK_SUCCESS(err);
9785
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009786 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009787 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009788 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009789 image_ci.format = VK_FORMAT_UNDEFINED;
9790 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9791 VkFormat format = static_cast<VkFormat>(f);
9792 VkFormatProperties fProps = m_device->format_properties(format);
9793 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9794 image_ci.format = format;
9795 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9796 break;
9797 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9798 image_ci.format = format;
9799 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9800 break;
9801 }
9802 }
9803 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9804 return;
9805 }
9806
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009807 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9808 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009809 image_ci.extent.width = 64;
9810 image_ci.extent.height = 64;
9811 image_ci.extent.depth = 1;
9812 image_ci.mipLevels = 1;
9813 image_ci.arrayLayers = 1;
9814 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009815 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009816 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009817 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9818 VkImage image;
9819 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9820 ASSERT_VK_SUCCESS(err);
9821 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009822 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009823
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009824 VkMemoryAllocateInfo mem_alloc = {};
9825 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9826 mem_alloc.pNext = NULL;
9827 mem_alloc.allocationSize = 0;
9828 mem_alloc.memoryTypeIndex = 0;
9829 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9830 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009831 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009832 ASSERT_TRUE(pass);
9833 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9834 ASSERT_VK_SUCCESS(err);
9835 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9836 ASSERT_VK_SUCCESS(err);
9837 // Now create view for image
9838 VkImageViewCreateInfo image_view_ci = {};
9839 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9840 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009841 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009842 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9843 image_view_ci.subresourceRange.layerCount = 1;
9844 image_view_ci.subresourceRange.baseArrayLayer = 0;
9845 image_view_ci.subresourceRange.levelCount = 1;
9846 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9847 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009848 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009849 ASSERT_VK_SUCCESS(err);
9850
9851 VkDescriptorBufferInfo buff_info = {};
9852 buff_info.buffer = buffer;
9853 VkDescriptorImageInfo img_info = {};
9854 img_info.imageView = image_view;
9855 VkWriteDescriptorSet descriptor_write = {};
9856 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9857 descriptor_write.dstBinding = 0;
9858 descriptor_write.descriptorCount = 1;
9859 descriptor_write.pTexelBufferView = &buff_view;
9860 descriptor_write.pBufferInfo = &buff_info;
9861 descriptor_write.pImageInfo = &img_info;
9862
9863 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009864 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009865 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9866 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9867 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9868 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9869 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9870 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9871 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9872 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9873 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9874 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9875 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009876 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009877 // Start loop at 1 as SAMPLER desc type has no usage bit error
9878 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009879 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9880 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9881 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9882 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009883 descriptor_write.descriptorType = VkDescriptorType(i);
9884 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009886
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009887 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009888
9889 m_errorMonitor->VerifyFound();
9890 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009891 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9892 descriptor_write.pTexelBufferView = &buff_view;
9893 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009894 }
Tony Barbour415497c2017-01-24 10:06:09 -07009895
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009896 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9897 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009898 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009899 vkDestroyImageView(m_device->device(), image_view, NULL);
9900 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009901 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009902 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009903 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009904 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009905 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009906 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9907}
9908
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009909TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009910 TEST_DESCRIPTION(
9911 "Attempt to update buffer descriptor set that has incorrect "
9912 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009913 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009914 "2. range value of 0\n"
9915 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009916 VkResult err;
9917
Tony Barbour1fa09702017-03-16 12:09:08 -06009918 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009919 VkDescriptorPoolSize ds_type_count = {};
9920 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9921 ds_type_count.descriptorCount = 1;
9922
9923 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9924 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9925 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009926 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009927 ds_pool_ci.maxSets = 1;
9928 ds_pool_ci.poolSizeCount = 1;
9929 ds_pool_ci.pPoolSizes = &ds_type_count;
9930
9931 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009932 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009933 ASSERT_VK_SUCCESS(err);
9934
9935 // Create layout with single uniform buffer descriptor
9936 VkDescriptorSetLayoutBinding dsl_binding = {};
9937 dsl_binding.binding = 0;
9938 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9939 dsl_binding.descriptorCount = 1;
9940 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9941 dsl_binding.pImmutableSamplers = NULL;
9942
9943 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9944 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9945 ds_layout_ci.pNext = NULL;
9946 ds_layout_ci.bindingCount = 1;
9947 ds_layout_ci.pBindings = &dsl_binding;
9948 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009949 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009950 ASSERT_VK_SUCCESS(err);
9951
9952 VkDescriptorSet descriptor_set = {};
9953 VkDescriptorSetAllocateInfo alloc_info = {};
9954 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9955 alloc_info.descriptorSetCount = 1;
9956 alloc_info.descriptorPool = ds_pool;
9957 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009958 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009959 ASSERT_VK_SUCCESS(err);
9960
9961 // Create a buffer to be used for invalid updates
9962 VkBufferCreateInfo buff_ci = {};
9963 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9964 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009965 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009966 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9967 VkBuffer buffer;
9968 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9969 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009970
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009971 // Have to bind memory to buffer before descriptor update
9972 VkMemoryAllocateInfo mem_alloc = {};
9973 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9974 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009975 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009976 mem_alloc.memoryTypeIndex = 0;
9977
9978 VkMemoryRequirements mem_reqs;
9979 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009980 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009981 if (!pass) {
9982 vkDestroyBuffer(m_device->device(), buffer, NULL);
9983 return;
9984 }
9985
9986 VkDeviceMemory mem;
9987 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9988 ASSERT_VK_SUCCESS(err);
9989 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9990 ASSERT_VK_SUCCESS(err);
9991
9992 VkDescriptorBufferInfo buff_info = {};
9993 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009994 // Cause error due to offset out of range
9995 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009996 buff_info.range = VK_WHOLE_SIZE;
9997 VkWriteDescriptorSet descriptor_write = {};
9998 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9999 descriptor_write.dstBinding = 0;
10000 descriptor_write.descriptorCount = 1;
10001 descriptor_write.pTexelBufferView = nullptr;
10002 descriptor_write.pBufferInfo = &buff_info;
10003 descriptor_write.pImageInfo = nullptr;
10004
10005 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10006 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010008
10009 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10010
10011 m_errorMonitor->VerifyFound();
10012 // Now cause error due to range of 0
10013 buff_info.offset = 0;
10014 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010016
10017 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10018
10019 m_errorMonitor->VerifyFound();
10020 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010021 buff_info.offset = 0;
10022 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010024
10025 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10026
10027 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010028 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010029 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10030 vkDestroyBuffer(m_device->device(), buffer, NULL);
10031 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10032 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10033}
10034
Tobin Ehlis845887e2017-02-02 19:01:44 -070010035TEST_F(VkLayerTest, DSBufferLimitErrors) {
10036 TEST_DESCRIPTION(
10037 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10038 "Test cases include:\n"
10039 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10040 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10041 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10042 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10043 VkResult err;
10044
Tony Barbour1fa09702017-03-16 12:09:08 -060010045 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010046 VkDescriptorPoolSize ds_type_count[2] = {};
10047 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10048 ds_type_count[0].descriptorCount = 1;
10049 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10050 ds_type_count[1].descriptorCount = 1;
10051
10052 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10053 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10054 ds_pool_ci.pNext = NULL;
10055 ds_pool_ci.maxSets = 1;
10056 ds_pool_ci.poolSizeCount = 2;
10057 ds_pool_ci.pPoolSizes = ds_type_count;
10058
10059 VkDescriptorPool ds_pool;
10060 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10061 ASSERT_VK_SUCCESS(err);
10062
10063 // Create layout with single uniform buffer & single storage buffer descriptor
10064 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10065 dsl_binding[0].binding = 0;
10066 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10067 dsl_binding[0].descriptorCount = 1;
10068 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10069 dsl_binding[0].pImmutableSamplers = NULL;
10070 dsl_binding[1].binding = 1;
10071 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10072 dsl_binding[1].descriptorCount = 1;
10073 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10074 dsl_binding[1].pImmutableSamplers = NULL;
10075
10076 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10077 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10078 ds_layout_ci.pNext = NULL;
10079 ds_layout_ci.bindingCount = 2;
10080 ds_layout_ci.pBindings = dsl_binding;
10081 VkDescriptorSetLayout ds_layout;
10082 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10083 ASSERT_VK_SUCCESS(err);
10084
10085 VkDescriptorSet descriptor_set = {};
10086 VkDescriptorSetAllocateInfo alloc_info = {};
10087 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10088 alloc_info.descriptorSetCount = 1;
10089 alloc_info.descriptorPool = ds_pool;
10090 alloc_info.pSetLayouts = &ds_layout;
10091 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10092 ASSERT_VK_SUCCESS(err);
10093
10094 // Create a buffer to be used for invalid updates
10095 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10096 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10097 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10098 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10099 VkBufferCreateInfo ub_ci = {};
10100 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10101 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10102 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10103 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10104 VkBuffer uniform_buffer;
10105 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10106 ASSERT_VK_SUCCESS(err);
10107 VkBufferCreateInfo sb_ci = {};
10108 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10109 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10110 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10111 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10112 VkBuffer storage_buffer;
10113 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10114 ASSERT_VK_SUCCESS(err);
10115 // Have to bind memory to buffer before descriptor update
10116 VkMemoryAllocateInfo mem_alloc = {};
10117 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10118 mem_alloc.pNext = NULL;
10119 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10120 mem_alloc.memoryTypeIndex = 0;
10121
Cort Stratton77a0d592017-02-17 13:14:13 -080010122 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10123 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10124 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10125 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10126 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010127 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010128 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010129 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010130 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10131 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010132 return;
10133 }
10134
10135 VkDeviceMemory mem;
10136 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010137 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010138 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010139 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10140 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10141 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10142 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10143 return;
10144 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010145 ASSERT_VK_SUCCESS(err);
10146 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10147 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010148 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010149 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10150 ASSERT_VK_SUCCESS(err);
10151
10152 VkDescriptorBufferInfo buff_info = {};
10153 buff_info.buffer = uniform_buffer;
10154 buff_info.range = ub_ci.size; // This will exceed limit
10155 VkWriteDescriptorSet descriptor_write = {};
10156 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10157 descriptor_write.dstBinding = 0;
10158 descriptor_write.descriptorCount = 1;
10159 descriptor_write.pTexelBufferView = nullptr;
10160 descriptor_write.pBufferInfo = &buff_info;
10161 descriptor_write.pImageInfo = nullptr;
10162
10163 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10164 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010165 if (max_ub_range != UINT32_MAX) {
10166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10167 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10168 m_errorMonitor->VerifyFound();
10169 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010170 // Reduce size of range to acceptable limit & cause offset error
10171 buff_info.range = max_ub_range;
10172 buff_info.offset = min_ub_align - 1;
10173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10174 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10175 m_errorMonitor->VerifyFound();
10176
10177 // Now break storage updates
10178 buff_info.buffer = storage_buffer;
10179 buff_info.range = sb_ci.size; // This will exceed limit
10180 buff_info.offset = 0; // Reset offset for this update
10181
10182 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10183 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010184 if (max_ub_range != UINT32_MAX) {
10185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10186 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10187 m_errorMonitor->VerifyFound();
10188 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010189
10190 // Reduce size of range to acceptable limit & cause offset error
10191 buff_info.range = max_sb_range;
10192 buff_info.offset = min_sb_align - 1;
10193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10194 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10195 m_errorMonitor->VerifyFound();
10196
10197 vkFreeMemory(m_device->device(), mem, NULL);
10198 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10199 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10200 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10201 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10202}
10203
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010204TEST_F(VkLayerTest, DSAspectBitsErrors) {
10205 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10206 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010207 TEST_DESCRIPTION(
10208 "Attempt to update descriptor sets for images "
10209 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010210 VkResult err;
10211
Tony Barbour1fa09702017-03-16 12:09:08 -060010212 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010213 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010214 if (!depth_format) {
10215 printf(" No Depth + Stencil format found. Skipped.\n");
10216 return;
10217 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010218 VkDescriptorPoolSize ds_type_count = {};
10219 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10220 ds_type_count.descriptorCount = 1;
10221
10222 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10223 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10224 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010225 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010226 ds_pool_ci.maxSets = 5;
10227 ds_pool_ci.poolSizeCount = 1;
10228 ds_pool_ci.pPoolSizes = &ds_type_count;
10229
10230 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010231 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010232 ASSERT_VK_SUCCESS(err);
10233
10234 VkDescriptorSetLayoutBinding dsl_binding = {};
10235 dsl_binding.binding = 0;
10236 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10237 dsl_binding.descriptorCount = 1;
10238 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10239 dsl_binding.pImmutableSamplers = NULL;
10240
10241 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10242 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10243 ds_layout_ci.pNext = NULL;
10244 ds_layout_ci.bindingCount = 1;
10245 ds_layout_ci.pBindings = &dsl_binding;
10246 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010247 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010248 ASSERT_VK_SUCCESS(err);
10249
10250 VkDescriptorSet descriptor_set = {};
10251 VkDescriptorSetAllocateInfo alloc_info = {};
10252 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10253 alloc_info.descriptorSetCount = 1;
10254 alloc_info.descriptorPool = ds_pool;
10255 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010256 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010257 ASSERT_VK_SUCCESS(err);
10258
10259 // Create an image to be used for invalid updates
10260 VkImageCreateInfo image_ci = {};
10261 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10262 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010263 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010264 image_ci.extent.width = 64;
10265 image_ci.extent.height = 64;
10266 image_ci.extent.depth = 1;
10267 image_ci.mipLevels = 1;
10268 image_ci.arrayLayers = 1;
10269 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010270 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010271 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10272 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10273 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10274 VkImage image;
10275 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10276 ASSERT_VK_SUCCESS(err);
10277 // Bind memory to image
10278 VkMemoryRequirements mem_reqs;
10279 VkDeviceMemory image_mem;
10280 bool pass;
10281 VkMemoryAllocateInfo mem_alloc = {};
10282 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10283 mem_alloc.pNext = NULL;
10284 mem_alloc.allocationSize = 0;
10285 mem_alloc.memoryTypeIndex = 0;
10286 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10287 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010288 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010289 ASSERT_TRUE(pass);
10290 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10291 ASSERT_VK_SUCCESS(err);
10292 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10293 ASSERT_VK_SUCCESS(err);
10294 // Now create view for image
10295 VkImageViewCreateInfo image_view_ci = {};
10296 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10297 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010298 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010299 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10300 image_view_ci.subresourceRange.layerCount = 1;
10301 image_view_ci.subresourceRange.baseArrayLayer = 0;
10302 image_view_ci.subresourceRange.levelCount = 1;
10303 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010304 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010305
10306 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010307 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010308 ASSERT_VK_SUCCESS(err);
10309
10310 VkDescriptorImageInfo img_info = {};
10311 img_info.imageView = image_view;
10312 VkWriteDescriptorSet descriptor_write = {};
10313 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10314 descriptor_write.dstBinding = 0;
10315 descriptor_write.descriptorCount = 1;
10316 descriptor_write.pTexelBufferView = NULL;
10317 descriptor_write.pBufferInfo = NULL;
10318 descriptor_write.pImageInfo = &img_info;
10319 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10320 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010321 const char *error_msg =
10322 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10323 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010325
10326 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10327
10328 m_errorMonitor->VerifyFound();
10329 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10330 vkDestroyImage(m_device->device(), image, NULL);
10331 vkFreeMemory(m_device->device(), image_mem, NULL);
10332 vkDestroyImageView(m_device->device(), image_view, NULL);
10333 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10334 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10335}
10336
Karl Schultz6addd812016-02-02 17:17:23 -070010337TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010338 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010339 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010340
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10342 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10343 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010344
Tony Barbour1fa09702017-03-16 12:09:08 -060010345 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010346 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010347 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010348 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10349 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010350
10351 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010352 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10353 ds_pool_ci.pNext = NULL;
10354 ds_pool_ci.maxSets = 1;
10355 ds_pool_ci.poolSizeCount = 1;
10356 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010357
Tobin Ehlis3b780662015-05-28 12:11:26 -060010358 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010359 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010360 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010361 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010362 dsl_binding.binding = 0;
10363 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10364 dsl_binding.descriptorCount = 1;
10365 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10366 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010367
Tony Barboureb254902015-07-15 12:50:33 -060010368 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010369 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10370 ds_layout_ci.pNext = NULL;
10371 ds_layout_ci.bindingCount = 1;
10372 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010373
Tobin Ehlis3b780662015-05-28 12:11:26 -060010374 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010375 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010376 ASSERT_VK_SUCCESS(err);
10377
10378 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010379 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010380 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010381 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010382 alloc_info.descriptorPool = ds_pool;
10383 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010384 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010385 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010386
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010387 VkSamplerCreateInfo sampler_ci = {};
10388 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10389 sampler_ci.pNext = NULL;
10390 sampler_ci.magFilter = VK_FILTER_NEAREST;
10391 sampler_ci.minFilter = VK_FILTER_NEAREST;
10392 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10393 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10394 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10395 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10396 sampler_ci.mipLodBias = 1.0;
10397 sampler_ci.anisotropyEnable = VK_FALSE;
10398 sampler_ci.maxAnisotropy = 1;
10399 sampler_ci.compareEnable = VK_FALSE;
10400 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10401 sampler_ci.minLod = 1.0;
10402 sampler_ci.maxLod = 1.0;
10403 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10404 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10405 VkSampler sampler;
10406 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10407 ASSERT_VK_SUCCESS(err);
10408
10409 VkDescriptorImageInfo info = {};
10410 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010411
10412 VkWriteDescriptorSet descriptor_write;
10413 memset(&descriptor_write, 0, sizeof(descriptor_write));
10414 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010415 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010416 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010417 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010418 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010419 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010420
10421 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10422
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010423 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010424
Chia-I Wuf7458c52015-10-26 21:10:41 +080010425 vkDestroySampler(m_device->device(), sampler, NULL);
10426 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10427 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010428}
10429
Karl Schultz6addd812016-02-02 17:17:23 -070010430TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010431 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010432 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010433
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010435
Tony Barbour1fa09702017-03-16 12:09:08 -060010436 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010437 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010438 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010439 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10440 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010441
10442 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010443 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10444 ds_pool_ci.pNext = NULL;
10445 ds_pool_ci.maxSets = 1;
10446 ds_pool_ci.poolSizeCount = 1;
10447 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010448
Tobin Ehlis3b780662015-05-28 12:11:26 -060010449 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010450 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010451 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010452
Tony Barboureb254902015-07-15 12:50:33 -060010453 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010454 dsl_binding.binding = 0;
10455 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10456 dsl_binding.descriptorCount = 1;
10457 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10458 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010459
10460 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010461 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10462 ds_layout_ci.pNext = NULL;
10463 ds_layout_ci.bindingCount = 1;
10464 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010465
Tobin Ehlis3b780662015-05-28 12:11:26 -060010466 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010467 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010468 ASSERT_VK_SUCCESS(err);
10469
10470 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010471 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010472 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010473 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010474 alloc_info.descriptorPool = ds_pool;
10475 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010476 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010477 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010478
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010479 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10480
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010481 // Correctly update descriptor to avoid "NOT_UPDATED" error
10482 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010483 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010484 buff_info.offset = 0;
10485 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010486
10487 VkWriteDescriptorSet descriptor_write;
10488 memset(&descriptor_write, 0, sizeof(descriptor_write));
10489 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010490 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010491 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010492 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010493 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10494 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010495
10496 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10497
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010498 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010499
Chia-I Wuf7458c52015-10-26 21:10:41 +080010500 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10501 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010502}
10503
Karl Schultz6addd812016-02-02 17:17:23 -070010504TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010505 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010506 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010507
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010509
Tony Barbour1fa09702017-03-16 12:09:08 -060010510 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010511 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010512 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010513 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10514 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010515
10516 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010517 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10518 ds_pool_ci.pNext = NULL;
10519 ds_pool_ci.maxSets = 1;
10520 ds_pool_ci.poolSizeCount = 1;
10521 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010522
Tobin Ehlis3b780662015-05-28 12:11:26 -060010523 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010524 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010525 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010526
Tony Barboureb254902015-07-15 12:50:33 -060010527 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010528 dsl_binding.binding = 0;
10529 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10530 dsl_binding.descriptorCount = 1;
10531 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10532 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010533
10534 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010535 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10536 ds_layout_ci.pNext = NULL;
10537 ds_layout_ci.bindingCount = 1;
10538 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010539 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010540 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010541 ASSERT_VK_SUCCESS(err);
10542
10543 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010544 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010545 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010546 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010547 alloc_info.descriptorPool = ds_pool;
10548 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010549 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010550 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010551
Tony Barboureb254902015-07-15 12:50:33 -060010552 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010553 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10554 sampler_ci.pNext = NULL;
10555 sampler_ci.magFilter = VK_FILTER_NEAREST;
10556 sampler_ci.minFilter = VK_FILTER_NEAREST;
10557 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10558 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10559 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10560 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10561 sampler_ci.mipLodBias = 1.0;
10562 sampler_ci.anisotropyEnable = VK_FALSE;
10563 sampler_ci.maxAnisotropy = 1;
10564 sampler_ci.compareEnable = VK_FALSE;
10565 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10566 sampler_ci.minLod = 1.0;
10567 sampler_ci.maxLod = 1.0;
10568 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10569 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010570
Tobin Ehlis3b780662015-05-28 12:11:26 -060010571 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010572 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010573 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010574
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010575 VkDescriptorImageInfo info = {};
10576 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010577
10578 VkWriteDescriptorSet descriptor_write;
10579 memset(&descriptor_write, 0, sizeof(descriptor_write));
10580 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010581 descriptor_write.dstSet = descriptorSet;
10582 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010583 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010584 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010585 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010586 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010587
10588 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10589
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010590 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010591
Chia-I Wuf7458c52015-10-26 21:10:41 +080010592 vkDestroySampler(m_device->device(), sampler, NULL);
10593 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10594 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010595}
10596
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010597TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10598 // Create layout w/ empty binding and attempt to update it
10599 VkResult err;
10600
Tony Barbour1fa09702017-03-16 12:09:08 -060010601 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010602
10603 VkDescriptorPoolSize ds_type_count = {};
10604 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10605 ds_type_count.descriptorCount = 1;
10606
10607 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10608 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10609 ds_pool_ci.pNext = NULL;
10610 ds_pool_ci.maxSets = 1;
10611 ds_pool_ci.poolSizeCount = 1;
10612 ds_pool_ci.pPoolSizes = &ds_type_count;
10613
10614 VkDescriptorPool ds_pool;
10615 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10616 ASSERT_VK_SUCCESS(err);
10617
10618 VkDescriptorSetLayoutBinding dsl_binding = {};
10619 dsl_binding.binding = 0;
10620 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10621 dsl_binding.descriptorCount = 0;
10622 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10623 dsl_binding.pImmutableSamplers = NULL;
10624
10625 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10626 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10627 ds_layout_ci.pNext = NULL;
10628 ds_layout_ci.bindingCount = 1;
10629 ds_layout_ci.pBindings = &dsl_binding;
10630 VkDescriptorSetLayout ds_layout;
10631 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10632 ASSERT_VK_SUCCESS(err);
10633
10634 VkDescriptorSet descriptor_set;
10635 VkDescriptorSetAllocateInfo alloc_info = {};
10636 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10637 alloc_info.descriptorSetCount = 1;
10638 alloc_info.descriptorPool = ds_pool;
10639 alloc_info.pSetLayouts = &ds_layout;
10640 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10641 ASSERT_VK_SUCCESS(err);
10642
10643 VkSamplerCreateInfo sampler_ci = {};
10644 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10645 sampler_ci.magFilter = VK_FILTER_NEAREST;
10646 sampler_ci.minFilter = VK_FILTER_NEAREST;
10647 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10648 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10649 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10650 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10651 sampler_ci.mipLodBias = 1.0;
10652 sampler_ci.maxAnisotropy = 1;
10653 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10654 sampler_ci.minLod = 1.0;
10655 sampler_ci.maxLod = 1.0;
10656 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10657
10658 VkSampler sampler;
10659 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10660 ASSERT_VK_SUCCESS(err);
10661
10662 VkDescriptorImageInfo info = {};
10663 info.sampler = sampler;
10664
10665 VkWriteDescriptorSet descriptor_write;
10666 memset(&descriptor_write, 0, sizeof(descriptor_write));
10667 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10668 descriptor_write.dstSet = descriptor_set;
10669 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010670 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010671 // This is the wrong type, but empty binding error will be flagged first
10672 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10673 descriptor_write.pImageInfo = &info;
10674
10675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10676 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10677 m_errorMonitor->VerifyFound();
10678
10679 vkDestroySampler(m_device->device(), sampler, NULL);
10680 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10681 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10682}
10683
Karl Schultz6addd812016-02-02 17:17:23 -070010684TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10685 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10686 // types
10687 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010688
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010689 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 -060010690
Tony Barbour1fa09702017-03-16 12:09:08 -060010691 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010692
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010693 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010694 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10695 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010696
10697 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010698 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10699 ds_pool_ci.pNext = NULL;
10700 ds_pool_ci.maxSets = 1;
10701 ds_pool_ci.poolSizeCount = 1;
10702 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010703
Tobin Ehlis3b780662015-05-28 12:11:26 -060010704 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010705 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010706 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010707 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010708 dsl_binding.binding = 0;
10709 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10710 dsl_binding.descriptorCount = 1;
10711 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10712 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010713
Tony Barboureb254902015-07-15 12:50:33 -060010714 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010715 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10716 ds_layout_ci.pNext = NULL;
10717 ds_layout_ci.bindingCount = 1;
10718 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010719
Tobin Ehlis3b780662015-05-28 12:11:26 -060010720 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010721 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010722 ASSERT_VK_SUCCESS(err);
10723
10724 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010725 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010726 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010727 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010728 alloc_info.descriptorPool = ds_pool;
10729 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010730 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010731 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010732
Tony Barboureb254902015-07-15 12:50:33 -060010733 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010734 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10735 sampler_ci.pNext = NULL;
10736 sampler_ci.magFilter = VK_FILTER_NEAREST;
10737 sampler_ci.minFilter = VK_FILTER_NEAREST;
10738 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10739 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10740 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10741 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10742 sampler_ci.mipLodBias = 1.0;
10743 sampler_ci.anisotropyEnable = VK_FALSE;
10744 sampler_ci.maxAnisotropy = 1;
10745 sampler_ci.compareEnable = VK_FALSE;
10746 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10747 sampler_ci.minLod = 1.0;
10748 sampler_ci.maxLod = 1.0;
10749 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10750 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010751 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010752 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010753 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010754
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010755 VkDescriptorImageInfo info = {};
10756 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010757
10758 VkWriteDescriptorSet descriptor_write;
10759 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010760 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010761 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010762 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010763 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010764 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010765 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010766
10767 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10768
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010769 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010770
Chia-I Wuf7458c52015-10-26 21:10:41 +080010771 vkDestroySampler(m_device->device(), sampler, NULL);
10772 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10773 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010774}
10775
Karl Schultz6addd812016-02-02 17:17:23 -070010776TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010777 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010778 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010779
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010781
Tony Barbour1fa09702017-03-16 12:09:08 -060010782 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010783 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10784 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010785 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010786 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10787 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010788
10789 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010790 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10791 ds_pool_ci.pNext = NULL;
10792 ds_pool_ci.maxSets = 1;
10793 ds_pool_ci.poolSizeCount = 1;
10794 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010795
10796 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010797 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010798 ASSERT_VK_SUCCESS(err);
10799
10800 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010801 dsl_binding.binding = 0;
10802 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10803 dsl_binding.descriptorCount = 1;
10804 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10805 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010806
10807 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010808 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10809 ds_layout_ci.pNext = NULL;
10810 ds_layout_ci.bindingCount = 1;
10811 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010812 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010813 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010814 ASSERT_VK_SUCCESS(err);
10815
10816 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010817 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010818 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010819 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010820 alloc_info.descriptorPool = ds_pool;
10821 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010822 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010823 ASSERT_VK_SUCCESS(err);
10824
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010825 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010826
10827 VkDescriptorImageInfo descriptor_info;
10828 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10829 descriptor_info.sampler = sampler;
10830
10831 VkWriteDescriptorSet descriptor_write;
10832 memset(&descriptor_write, 0, sizeof(descriptor_write));
10833 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010834 descriptor_write.dstSet = descriptorSet;
10835 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010836 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010837 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10838 descriptor_write.pImageInfo = &descriptor_info;
10839
10840 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10841
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010842 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010843
Chia-I Wuf7458c52015-10-26 21:10:41 +080010844 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10845 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010846}
10847
Karl Schultz6addd812016-02-02 17:17:23 -070010848TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10849 // Create a single combined Image/Sampler descriptor and send it an invalid
10850 // imageView
10851 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010852
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010854
Tony Barbour1fa09702017-03-16 12:09:08 -060010855 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010856 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010857 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10858 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010859
10860 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010861 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10862 ds_pool_ci.pNext = NULL;
10863 ds_pool_ci.maxSets = 1;
10864 ds_pool_ci.poolSizeCount = 1;
10865 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010866
10867 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010868 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010869 ASSERT_VK_SUCCESS(err);
10870
10871 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010872 dsl_binding.binding = 0;
10873 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10874 dsl_binding.descriptorCount = 1;
10875 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10876 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010877
10878 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010879 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10880 ds_layout_ci.pNext = NULL;
10881 ds_layout_ci.bindingCount = 1;
10882 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010883 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010884 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010885 ASSERT_VK_SUCCESS(err);
10886
10887 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010888 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010889 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010890 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010891 alloc_info.descriptorPool = ds_pool;
10892 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010893 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010894 ASSERT_VK_SUCCESS(err);
10895
10896 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010897 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10898 sampler_ci.pNext = NULL;
10899 sampler_ci.magFilter = VK_FILTER_NEAREST;
10900 sampler_ci.minFilter = VK_FILTER_NEAREST;
10901 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10902 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10903 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10904 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10905 sampler_ci.mipLodBias = 1.0;
10906 sampler_ci.anisotropyEnable = VK_FALSE;
10907 sampler_ci.maxAnisotropy = 1;
10908 sampler_ci.compareEnable = VK_FALSE;
10909 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10910 sampler_ci.minLod = 1.0;
10911 sampler_ci.maxLod = 1.0;
10912 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10913 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010914
10915 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010916 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010917 ASSERT_VK_SUCCESS(err);
10918
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010919 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010920
10921 VkDescriptorImageInfo descriptor_info;
10922 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10923 descriptor_info.sampler = sampler;
10924 descriptor_info.imageView = view;
10925
10926 VkWriteDescriptorSet descriptor_write;
10927 memset(&descriptor_write, 0, sizeof(descriptor_write));
10928 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010929 descriptor_write.dstSet = descriptorSet;
10930 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010931 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010932 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10933 descriptor_write.pImageInfo = &descriptor_info;
10934
10935 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10936
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010937 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010938
Chia-I Wuf7458c52015-10-26 21:10:41 +080010939 vkDestroySampler(m_device->device(), sampler, NULL);
10940 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10941 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010942}
10943
Karl Schultz6addd812016-02-02 17:17:23 -070010944TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10945 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10946 // into the other
10947 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010948
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10950 " binding #1 with type "
10951 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10952 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010953
Tony Barbour1fa09702017-03-16 12:09:08 -060010954 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010955 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010956 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010957 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10958 ds_type_count[0].descriptorCount = 1;
10959 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10960 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010961
10962 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010963 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10964 ds_pool_ci.pNext = NULL;
10965 ds_pool_ci.maxSets = 1;
10966 ds_pool_ci.poolSizeCount = 2;
10967 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010968
10969 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010970 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010971 ASSERT_VK_SUCCESS(err);
10972 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010973 dsl_binding[0].binding = 0;
10974 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10975 dsl_binding[0].descriptorCount = 1;
10976 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10977 dsl_binding[0].pImmutableSamplers = NULL;
10978 dsl_binding[1].binding = 1;
10979 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10980 dsl_binding[1].descriptorCount = 1;
10981 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10982 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010983
10984 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010985 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10986 ds_layout_ci.pNext = NULL;
10987 ds_layout_ci.bindingCount = 2;
10988 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010989
10990 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010991 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010992 ASSERT_VK_SUCCESS(err);
10993
10994 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010995 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010996 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010997 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010998 alloc_info.descriptorPool = ds_pool;
10999 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011000 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011001 ASSERT_VK_SUCCESS(err);
11002
11003 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011004 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11005 sampler_ci.pNext = NULL;
11006 sampler_ci.magFilter = VK_FILTER_NEAREST;
11007 sampler_ci.minFilter = VK_FILTER_NEAREST;
11008 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11009 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11010 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11011 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11012 sampler_ci.mipLodBias = 1.0;
11013 sampler_ci.anisotropyEnable = VK_FALSE;
11014 sampler_ci.maxAnisotropy = 1;
11015 sampler_ci.compareEnable = VK_FALSE;
11016 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11017 sampler_ci.minLod = 1.0;
11018 sampler_ci.maxLod = 1.0;
11019 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11020 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011021
11022 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011023 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011024 ASSERT_VK_SUCCESS(err);
11025
11026 VkDescriptorImageInfo info = {};
11027 info.sampler = sampler;
11028
11029 VkWriteDescriptorSet descriptor_write;
11030 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11031 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011032 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011033 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011034 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011035 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11036 descriptor_write.pImageInfo = &info;
11037 // This write update should succeed
11038 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11039 // Now perform a copy update that fails due to type mismatch
11040 VkCopyDescriptorSet copy_ds_update;
11041 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11042 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11043 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011044 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011045 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011046 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11047 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011048 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11049
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011050 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011051 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011052 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 -060011053 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11054 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11055 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011056 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011057 copy_ds_update.dstSet = descriptorSet;
11058 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011059 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011060 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11061
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011062 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011063
Tobin Ehlis04356f92015-10-27 16:35:27 -060011064 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11066 " binding#1 with offset index of 1 plus "
11067 "update array offset of 0 and update of "
11068 "5 descriptors oversteps total number "
11069 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011070
Tobin Ehlis04356f92015-10-27 16:35:27 -060011071 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11072 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11073 copy_ds_update.srcSet = descriptorSet;
11074 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011075 copy_ds_update.dstSet = descriptorSet;
11076 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011077 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011078 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11079
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011080 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011081
Chia-I Wuf7458c52015-10-26 21:10:41 +080011082 vkDestroySampler(m_device->device(), sampler, NULL);
11083 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11084 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011085}
11086
Karl Schultz6addd812016-02-02 17:17:23 -070011087TEST_F(VkLayerTest, NumSamplesMismatch) {
11088 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11089 // sampleCount
11090 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011091
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011093
Tony Barbour1fa09702017-03-16 12:09:08 -060011094 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011095 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011096 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011097 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011098 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011099
11100 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011101 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11102 ds_pool_ci.pNext = NULL;
11103 ds_pool_ci.maxSets = 1;
11104 ds_pool_ci.poolSizeCount = 1;
11105 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011106
Tobin Ehlis3b780662015-05-28 12:11:26 -060011107 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011108 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011109 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011110
Tony Barboureb254902015-07-15 12:50:33 -060011111 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011112 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011113 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011114 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011115 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11116 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011117
Tony Barboureb254902015-07-15 12:50:33 -060011118 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11119 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11120 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011121 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011122 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011123
Tobin Ehlis3b780662015-05-28 12:11:26 -060011124 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011125 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011126 ASSERT_VK_SUCCESS(err);
11127
11128 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011129 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011130 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011131 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011132 alloc_info.descriptorPool = ds_pool;
11133 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011134 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011135 ASSERT_VK_SUCCESS(err);
11136
Tony Barboureb254902015-07-15 12:50:33 -060011137 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011138 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011139 pipe_ms_state_ci.pNext = NULL;
11140 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11141 pipe_ms_state_ci.sampleShadingEnable = 0;
11142 pipe_ms_state_ci.minSampleShading = 1.0;
11143 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011144
Tony Barboureb254902015-07-15 12:50:33 -060011145 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011146 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11147 pipeline_layout_ci.pNext = NULL;
11148 pipeline_layout_ci.setLayoutCount = 1;
11149 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011150
11151 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011152 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011153 ASSERT_VK_SUCCESS(err);
11154
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011155 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011156 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 -060011157 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011158 VkPipelineObj pipe(m_device);
11159 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011160 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011161 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011162 pipe.SetMSAA(&pipe_ms_state_ci);
11163 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011164
Tony Barbour552f6c02016-12-21 14:34:07 -070011165 m_commandBuffer->BeginCommandBuffer();
11166 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011167 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011168
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011169 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11170 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11171 VkRect2D scissor = {{0, 0}, {16, 16}};
11172 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11173
Mark Young29927482016-05-04 14:38:51 -060011174 // Render triangle (the error should trigger on the attempt to draw).
11175 Draw(3, 1, 0, 0);
11176
11177 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011178 m_commandBuffer->EndRenderPass();
11179 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011180
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011181 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011182
Chia-I Wuf7458c52015-10-26 21:10:41 +080011183 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11184 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11185 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011186}
Mark Young29927482016-05-04 14:38:51 -060011187
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011188TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011189 TEST_DESCRIPTION(
11190 "Hit RenderPass incompatible cases. "
11191 "Initial case is drawing with an active renderpass that's "
11192 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011193 VkResult err;
11194
Tony Barbour1fa09702017-03-16 12:09:08 -060011195 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011196 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11197
11198 VkDescriptorSetLayoutBinding dsl_binding = {};
11199 dsl_binding.binding = 0;
11200 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11201 dsl_binding.descriptorCount = 1;
11202 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11203 dsl_binding.pImmutableSamplers = NULL;
11204
11205 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11206 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11207 ds_layout_ci.pNext = NULL;
11208 ds_layout_ci.bindingCount = 1;
11209 ds_layout_ci.pBindings = &dsl_binding;
11210
11211 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011212 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011213 ASSERT_VK_SUCCESS(err);
11214
11215 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11216 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11217 pipeline_layout_ci.pNext = NULL;
11218 pipeline_layout_ci.setLayoutCount = 1;
11219 pipeline_layout_ci.pSetLayouts = &ds_layout;
11220
11221 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011222 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011223 ASSERT_VK_SUCCESS(err);
11224
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011225 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011226 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 -060011227 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011228 // Create a renderpass that will be incompatible with default renderpass
11229 VkAttachmentReference attach = {};
11230 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11231 VkAttachmentReference color_att = {};
11232 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11233 VkSubpassDescription subpass = {};
11234 subpass.inputAttachmentCount = 1;
11235 subpass.pInputAttachments = &attach;
11236 subpass.colorAttachmentCount = 1;
11237 subpass.pColorAttachments = &color_att;
11238 VkRenderPassCreateInfo rpci = {};
11239 rpci.subpassCount = 1;
11240 rpci.pSubpasses = &subpass;
11241 rpci.attachmentCount = 1;
11242 VkAttachmentDescription attach_desc = {};
11243 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011244 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11245 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011246 rpci.pAttachments = &attach_desc;
11247 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11248 VkRenderPass rp;
11249 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11250 VkPipelineObj pipe(m_device);
11251 pipe.AddShader(&vs);
11252 pipe.AddShader(&fs);
11253 pipe.AddColorAttachment();
11254 VkViewport view_port = {};
11255 m_viewports.push_back(view_port);
11256 pipe.SetViewport(m_viewports);
11257 VkRect2D rect = {};
11258 m_scissors.push_back(rect);
11259 pipe.SetScissor(m_scissors);
11260 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11261
11262 VkCommandBufferInheritanceInfo cbii = {};
11263 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11264 cbii.renderPass = rp;
11265 cbii.subpass = 0;
11266 VkCommandBufferBeginInfo cbbi = {};
11267 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11268 cbbi.pInheritanceInfo = &cbii;
11269 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11270 VkRenderPassBeginInfo rpbi = {};
11271 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11272 rpbi.framebuffer = m_framebuffer;
11273 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011274 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11275 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011276
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011278 // Render triangle (the error should trigger on the attempt to draw).
11279 Draw(3, 1, 0, 0);
11280
11281 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011282 m_commandBuffer->EndRenderPass();
11283 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011284
11285 m_errorMonitor->VerifyFound();
11286
11287 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11288 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11289 vkDestroyRenderPass(m_device->device(), rp, NULL);
11290}
11291
Mark Youngc89c6312016-03-31 16:03:20 -060011292TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11293 // Create Pipeline where the number of blend attachments doesn't match the
11294 // number of color attachments. In this case, we don't add any color
11295 // blend attachments even though we have a color attachment.
11296 VkResult err;
11297
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011299
Tony Barbour1fa09702017-03-16 12:09:08 -060011300 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011301 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11302 VkDescriptorPoolSize ds_type_count = {};
11303 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11304 ds_type_count.descriptorCount = 1;
11305
11306 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11307 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11308 ds_pool_ci.pNext = NULL;
11309 ds_pool_ci.maxSets = 1;
11310 ds_pool_ci.poolSizeCount = 1;
11311 ds_pool_ci.pPoolSizes = &ds_type_count;
11312
11313 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011314 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011315 ASSERT_VK_SUCCESS(err);
11316
11317 VkDescriptorSetLayoutBinding dsl_binding = {};
11318 dsl_binding.binding = 0;
11319 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11320 dsl_binding.descriptorCount = 1;
11321 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11322 dsl_binding.pImmutableSamplers = NULL;
11323
11324 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11325 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11326 ds_layout_ci.pNext = NULL;
11327 ds_layout_ci.bindingCount = 1;
11328 ds_layout_ci.pBindings = &dsl_binding;
11329
11330 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011331 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011332 ASSERT_VK_SUCCESS(err);
11333
11334 VkDescriptorSet descriptorSet;
11335 VkDescriptorSetAllocateInfo alloc_info = {};
11336 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11337 alloc_info.descriptorSetCount = 1;
11338 alloc_info.descriptorPool = ds_pool;
11339 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011340 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011341 ASSERT_VK_SUCCESS(err);
11342
11343 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011344 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011345 pipe_ms_state_ci.pNext = NULL;
11346 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11347 pipe_ms_state_ci.sampleShadingEnable = 0;
11348 pipe_ms_state_ci.minSampleShading = 1.0;
11349 pipe_ms_state_ci.pSampleMask = NULL;
11350
11351 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11352 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11353 pipeline_layout_ci.pNext = NULL;
11354 pipeline_layout_ci.setLayoutCount = 1;
11355 pipeline_layout_ci.pSetLayouts = &ds_layout;
11356
11357 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011358 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011359 ASSERT_VK_SUCCESS(err);
11360
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011361 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011362 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 -060011363 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011364 VkPipelineObj pipe(m_device);
11365 pipe.AddShader(&vs);
11366 pipe.AddShader(&fs);
11367 pipe.SetMSAA(&pipe_ms_state_ci);
11368 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011369 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011370
11371 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11372 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11373 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11374}
Mark Young29927482016-05-04 14:38:51 -060011375
Mark Muellerd4914412016-06-13 17:52:06 -060011376TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011377 TEST_DESCRIPTION(
11378 "Points to a wrong colorAttachment index in a VkClearAttachment "
11379 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011380 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011382
11383 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11384 m_errorMonitor->VerifyFound();
11385}
11386
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011387TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011388 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11389 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011390
Tony Barbour1fa09702017-03-16 12:09:08 -060011391 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011393
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011394 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011395 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11396 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011397
11398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011399 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11400 ds_pool_ci.pNext = NULL;
11401 ds_pool_ci.maxSets = 1;
11402 ds_pool_ci.poolSizeCount = 1;
11403 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011404
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011405 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011406 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011407 ASSERT_VK_SUCCESS(err);
11408
Tony Barboureb254902015-07-15 12:50:33 -060011409 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011410 dsl_binding.binding = 0;
11411 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11412 dsl_binding.descriptorCount = 1;
11413 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11414 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011415
Tony Barboureb254902015-07-15 12:50:33 -060011416 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011417 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11418 ds_layout_ci.pNext = NULL;
11419 ds_layout_ci.bindingCount = 1;
11420 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011421
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011422 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011423 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011424 ASSERT_VK_SUCCESS(err);
11425
11426 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011427 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011428 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011429 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011430 alloc_info.descriptorPool = ds_pool;
11431 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011432 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011433 ASSERT_VK_SUCCESS(err);
11434
Tony Barboureb254902015-07-15 12:50:33 -060011435 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011436 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011437 pipe_ms_state_ci.pNext = NULL;
11438 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11439 pipe_ms_state_ci.sampleShadingEnable = 0;
11440 pipe_ms_state_ci.minSampleShading = 1.0;
11441 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011442
Tony Barboureb254902015-07-15 12:50:33 -060011443 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011444 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11445 pipeline_layout_ci.pNext = NULL;
11446 pipeline_layout_ci.setLayoutCount = 1;
11447 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011448
11449 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011450 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011451 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011452
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011453 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011454 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011455 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011456 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011457
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011458 VkPipelineObj pipe(m_device);
11459 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011460 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011461 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011462 pipe.SetMSAA(&pipe_ms_state_ci);
11463 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011464
Tony Barbour552f6c02016-12-21 14:34:07 -070011465 m_commandBuffer->BeginCommandBuffer();
11466 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011467
Karl Schultz6addd812016-02-02 17:17:23 -070011468 // Main thing we care about for this test is that the VkImage obj we're
11469 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011470 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011471 VkClearAttachment color_attachment;
11472 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11473 color_attachment.clearValue.color.float32[0] = 1.0;
11474 color_attachment.clearValue.color.float32[1] = 1.0;
11475 color_attachment.clearValue.color.float32[2] = 1.0;
11476 color_attachment.clearValue.color.float32[3] = 1.0;
11477 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011478 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011479
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011480 // Call for full-sized FB Color attachment prior to issuing a Draw
11481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011482 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011483 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011484 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011485
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011486 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11487 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11489 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11490 m_errorMonitor->VerifyFound();
11491
11492 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11493 clear_rect.layerCount = 2;
11494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11495 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011497
Chia-I Wuf7458c52015-10-26 21:10:41 +080011498 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11499 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11500 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011501}
11502
Karl Schultz6addd812016-02-02 17:17:23 -070011503TEST_F(VkLayerTest, VtxBufferBadIndex) {
11504 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011505
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011506 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11507 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011508
Tony Barbour1fa09702017-03-16 12:09:08 -060011509 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011510 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011512
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011513 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011514 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11515 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011516
11517 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011518 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11519 ds_pool_ci.pNext = NULL;
11520 ds_pool_ci.maxSets = 1;
11521 ds_pool_ci.poolSizeCount = 1;
11522 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011523
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011524 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011525 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011526 ASSERT_VK_SUCCESS(err);
11527
Tony Barboureb254902015-07-15 12:50:33 -060011528 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011529 dsl_binding.binding = 0;
11530 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11531 dsl_binding.descriptorCount = 1;
11532 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11533 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011534
Tony Barboureb254902015-07-15 12:50:33 -060011535 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011536 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11537 ds_layout_ci.pNext = NULL;
11538 ds_layout_ci.bindingCount = 1;
11539 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011540
Tobin Ehlis502480b2015-06-24 15:53:07 -060011541 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011542 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011543 ASSERT_VK_SUCCESS(err);
11544
11545 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011546 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011547 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011548 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011549 alloc_info.descriptorPool = ds_pool;
11550 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011551 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011552 ASSERT_VK_SUCCESS(err);
11553
Tony Barboureb254902015-07-15 12:50:33 -060011554 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011555 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011556 pipe_ms_state_ci.pNext = NULL;
11557 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11558 pipe_ms_state_ci.sampleShadingEnable = 0;
11559 pipe_ms_state_ci.minSampleShading = 1.0;
11560 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011561
Tony Barboureb254902015-07-15 12:50:33 -060011562 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011563 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11564 pipeline_layout_ci.pNext = NULL;
11565 pipeline_layout_ci.setLayoutCount = 1;
11566 pipeline_layout_ci.pSetLayouts = &ds_layout;
11567 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011568
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011569 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011570 ASSERT_VK_SUCCESS(err);
11571
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011572 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011573 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 -060011574 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011575 VkPipelineObj pipe(m_device);
11576 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011577 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011578 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011579 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011580 pipe.SetViewport(m_viewports);
11581 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011582 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011583
Tony Barbour552f6c02016-12-21 14:34:07 -070011584 m_commandBuffer->BeginCommandBuffer();
11585 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011586 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011587 // Don't care about actual data, just need to get to draw to flag error
11588 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011589 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011590 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011591 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011592
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011593 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011594
Chia-I Wuf7458c52015-10-26 21:10:41 +080011595 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11596 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11597 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011598}
Mark Muellerdfe37552016-07-07 14:47:42 -060011599
Mark Mueller2ee294f2016-08-04 12:59:48 -060011600TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011601 TEST_DESCRIPTION(
11602 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11603 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011604 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011605
Mark Mueller880fce52016-08-17 15:23:23 -060011606 // The following test fails with recent NVidia drivers.
11607 // By the time core_validation is reached, the NVidia
11608 // driver has sanitized the invalid condition and core_validation
11609 // is not introduced to the failure condition. This is not the case
11610 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011611 // uint32_t count = static_cast<uint32_t>(~0);
11612 // VkPhysicalDevice physical_device;
11613 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11614 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011615
Mark Mueller2ee294f2016-08-04 12:59:48 -060011616 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011617 VkDeviceQueueCreateInfo queue_create_info = {};
11618 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11619 queue_create_info.queueCount = 1;
11620 queue_create_info.pQueuePriorities = &queue_priority;
11621 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11622
11623 VkPhysicalDeviceFeatures features = m_device->phy().features();
11624 VkDevice testDevice;
11625 VkDeviceCreateInfo device_create_info = {};
11626 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11627 device_create_info.queueCreateInfoCount = 1;
11628 device_create_info.pQueueCreateInfos = &queue_create_info;
11629 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011630
11631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11632 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011633 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11634 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11635 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011636 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11637 m_errorMonitor->VerifyFound();
11638
11639 queue_create_info.queueFamilyIndex = 1;
11640
11641 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11642 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11643 for (unsigned i = 0; i < feature_count; i++) {
11644 if (VK_FALSE == feature_array[i]) {
11645 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011646 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11648 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011649 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11650 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11651 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11653 "You requested features that are unavailable on this device. You should first "
11654 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011655 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11656 m_errorMonitor->VerifyFound();
11657 break;
11658 }
11659 }
11660}
11661
Tobin Ehlis16edf082016-11-21 12:33:49 -070011662TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11663 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11664
Tony Barbour1fa09702017-03-16 12:09:08 -060011665 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011666
11667 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11668 std::vector<VkDeviceQueueCreateInfo> queue_info;
11669 queue_info.reserve(queue_props.size());
11670 std::vector<std::vector<float>> queue_priorities;
11671 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11672 VkDeviceQueueCreateInfo qi{};
11673 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11674 qi.queueFamilyIndex = i;
11675 qi.queueCount = queue_props[i].queueCount;
11676 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11677 qi.pQueuePriorities = queue_priorities[i].data();
11678 queue_info.push_back(qi);
11679 }
11680
11681 std::vector<const char *> device_extension_names;
11682
11683 VkDevice local_device;
11684 VkDeviceCreateInfo device_create_info = {};
11685 auto features = m_device->phy().features();
11686 // Intentionally disable pipeline stats
11687 features.pipelineStatisticsQuery = VK_FALSE;
11688 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11689 device_create_info.pNext = NULL;
11690 device_create_info.queueCreateInfoCount = queue_info.size();
11691 device_create_info.pQueueCreateInfos = queue_info.data();
11692 device_create_info.enabledLayerCount = 0;
11693 device_create_info.ppEnabledLayerNames = NULL;
11694 device_create_info.pEnabledFeatures = &features;
11695 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11696 ASSERT_VK_SUCCESS(err);
11697
11698 VkQueryPoolCreateInfo qpci{};
11699 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11700 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11701 qpci.queryCount = 1;
11702 VkQueryPool query_pool;
11703
11704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11705 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11706 m_errorMonitor->VerifyFound();
11707
11708 vkDestroyDevice(local_device, nullptr);
11709}
11710
Mark Mueller2ee294f2016-08-04 12:59:48 -060011711TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011712 TEST_DESCRIPTION(
11713 "Use an invalid queue index in a vkCmdWaitEvents call."
11714 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011715
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011716 const char *invalid_queue_index =
11717 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11718 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11719 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011720
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011721 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011722
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011724
Tony Barbour1fa09702017-03-16 12:09:08 -060011725 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011726
11727 VkEvent event;
11728 VkEventCreateInfo event_create_info{};
11729 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11730 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11731
Mark Mueller2ee294f2016-08-04 12:59:48 -060011732 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011733 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011734
Tony Barbour552f6c02016-12-21 14:34:07 -070011735 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011736
11737 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060011738 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 -060011739 ASSERT_TRUE(image.initialized());
11740 VkImageMemoryBarrier img_barrier = {};
11741 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11742 img_barrier.pNext = NULL;
11743 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11744 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11745 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11746 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11747 img_barrier.image = image.handle();
11748 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011749
11750 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11751 // that layer validation catches the case when it is not.
11752 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011753 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11754 img_barrier.subresourceRange.baseArrayLayer = 0;
11755 img_barrier.subresourceRange.baseMipLevel = 0;
11756 img_barrier.subresourceRange.layerCount = 1;
11757 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011758 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11759 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011760 m_errorMonitor->VerifyFound();
11761
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011763
11764 VkQueryPool query_pool;
11765 VkQueryPoolCreateInfo query_pool_create_info = {};
11766 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11767 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11768 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011769 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011770
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011771 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011772 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11773
11774 vkEndCommandBuffer(m_commandBuffer->handle());
11775 m_errorMonitor->VerifyFound();
11776
11777 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11778 vkDestroyEvent(m_device->device(), event, nullptr);
11779}
11780
Mark Muellerdfe37552016-07-07 14:47:42 -060011781TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011782 TEST_DESCRIPTION(
11783 "Submit a command buffer using deleted vertex buffer, "
11784 "delete a buffer twice, use an invalid offset for each "
11785 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011786
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011787 const char *deleted_buffer_in_command_buffer =
11788 "Cannot submit cmd buffer "
11789 "using deleted buffer ";
11790 const char *invalid_offset_message =
11791 "vkBindBufferMemory(): "
11792 "memoryOffset is 0x";
11793 const char *invalid_storage_buffer_offset_message =
11794 "vkBindBufferMemory(): "
11795 "storage memoryOffset "
11796 "is 0x";
11797 const char *invalid_texel_buffer_offset_message =
11798 "vkBindBufferMemory(): "
11799 "texel memoryOffset "
11800 "is 0x";
11801 const char *invalid_uniform_buffer_offset_message =
11802 "vkBindBufferMemory(): "
11803 "uniform memoryOffset "
11804 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011805
Tony Barbour1fa09702017-03-16 12:09:08 -060011806 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011807 ASSERT_NO_FATAL_FAILURE(InitViewport());
11808 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11809
11810 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011811 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011812 pipe_ms_state_ci.pNext = NULL;
11813 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11814 pipe_ms_state_ci.sampleShadingEnable = 0;
11815 pipe_ms_state_ci.minSampleShading = 1.0;
11816 pipe_ms_state_ci.pSampleMask = nullptr;
11817
11818 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11819 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11820 VkPipelineLayout pipeline_layout;
11821
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011822 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011823 ASSERT_VK_SUCCESS(err);
11824
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011825 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11826 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011827 VkPipelineObj pipe(m_device);
11828 pipe.AddShader(&vs);
11829 pipe.AddShader(&fs);
11830 pipe.AddColorAttachment();
11831 pipe.SetMSAA(&pipe_ms_state_ci);
11832 pipe.SetViewport(m_viewports);
11833 pipe.SetScissor(m_scissors);
11834 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11835
Tony Barbour552f6c02016-12-21 14:34:07 -070011836 m_commandBuffer->BeginCommandBuffer();
11837 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011838 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011839
11840 {
11841 // Create and bind a vertex buffer in a reduced scope, which will cause
11842 // it to be deleted upon leaving this scope
11843 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011844 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011845 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11846 draw_verticies.AddVertexInputToPipe(pipe);
11847 }
11848
11849 Draw(1, 0, 0, 0);
11850
Tony Barbour552f6c02016-12-21 14:34:07 -070011851 m_commandBuffer->EndRenderPass();
11852 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011853
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011855 QueueCommandBuffer(false);
11856 m_errorMonitor->VerifyFound();
11857
11858 {
11859 // Create and bind a vertex buffer in a reduced scope, and delete it
11860 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011861 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011863 buffer_test.TestDoubleDestroy();
11864 }
11865 m_errorMonitor->VerifyFound();
11866
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011867 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011868 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011869 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011871 m_errorMonitor->SetUnexpectedError(
11872 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11873 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011874 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11875 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011876 m_errorMonitor->VerifyFound();
11877 }
11878
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011879 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11880 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011881 // Create and bind a memory buffer with an invalid offset again,
11882 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011884 m_errorMonitor->SetUnexpectedError(
11885 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11886 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011887 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11888 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011889 m_errorMonitor->VerifyFound();
11890 }
11891
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011892 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011893 // Create and bind a memory buffer with an invalid offset again, but
11894 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011896 m_errorMonitor->SetUnexpectedError(
11897 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11898 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011899 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11900 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011901 m_errorMonitor->VerifyFound();
11902 }
11903
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011904 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011905 // Create and bind a memory buffer with an invalid offset again, but
11906 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011908 m_errorMonitor->SetUnexpectedError(
11909 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11910 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011911 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11912 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011913 m_errorMonitor->VerifyFound();
11914 }
11915
11916 {
11917 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011919 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11920 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011921 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11922 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011923 m_errorMonitor->VerifyFound();
11924 }
11925
11926 {
11927 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011929 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11930 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011931 }
11932 m_errorMonitor->VerifyFound();
11933
11934 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11935}
11936
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011937// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11938TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011939 TEST_DESCRIPTION(
11940 "Hit all possible validation checks associated with the "
11941 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11942 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011943 // 3 in ValidateCmdBufImageLayouts
11944 // * -1 Attempt to submit cmd buf w/ deleted image
11945 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11946 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011947
Tony Barbour1fa09702017-03-16 12:09:08 -060011948 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011949 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011950 if (!depth_format) {
11951 printf(" No Depth + Stencil format found. Skipped.\n");
11952 return;
11953 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011954 // Create src & dst images to use for copy operations
11955 VkImage src_image;
11956 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011957 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011958
11959 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11960 const int32_t tex_width = 32;
11961 const int32_t tex_height = 32;
11962
11963 VkImageCreateInfo image_create_info = {};
11964 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11965 image_create_info.pNext = NULL;
11966 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11967 image_create_info.format = tex_format;
11968 image_create_info.extent.width = tex_width;
11969 image_create_info.extent.height = tex_height;
11970 image_create_info.extent.depth = 1;
11971 image_create_info.mipLevels = 1;
11972 image_create_info.arrayLayers = 4;
11973 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11974 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11975 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011976 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011977 image_create_info.flags = 0;
11978
11979 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11980 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011981 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011982 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11983 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011984 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11985 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11986 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11987 ASSERT_VK_SUCCESS(err);
11988
11989 // Allocate memory
11990 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011991 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011992 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011993 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11994 mem_alloc.pNext = NULL;
11995 mem_alloc.allocationSize = 0;
11996 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011997
11998 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011999 mem_alloc.allocationSize = img_mem_reqs.size;
12000 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012001 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080012002 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080012003 ASSERT_VK_SUCCESS(err);
12004
12005 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012006 mem_alloc.allocationSize = img_mem_reqs.size;
12007 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012008 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012009 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012010 ASSERT_VK_SUCCESS(err);
12011
12012 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012013 mem_alloc.allocationSize = img_mem_reqs.size;
12014 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012015 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012016 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012017 ASSERT_VK_SUCCESS(err);
12018
12019 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12020 ASSERT_VK_SUCCESS(err);
12021 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12022 ASSERT_VK_SUCCESS(err);
12023 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12024 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012025
Tony Barbour552f6c02016-12-21 14:34:07 -070012026 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012027 VkImageCopy copy_region;
12028 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12029 copy_region.srcSubresource.mipLevel = 0;
12030 copy_region.srcSubresource.baseArrayLayer = 0;
12031 copy_region.srcSubresource.layerCount = 1;
12032 copy_region.srcOffset.x = 0;
12033 copy_region.srcOffset.y = 0;
12034 copy_region.srcOffset.z = 0;
12035 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12036 copy_region.dstSubresource.mipLevel = 0;
12037 copy_region.dstSubresource.baseArrayLayer = 0;
12038 copy_region.dstSubresource.layerCount = 1;
12039 copy_region.dstOffset.x = 0;
12040 copy_region.dstOffset.y = 0;
12041 copy_region.dstOffset.z = 0;
12042 copy_region.extent.width = 1;
12043 copy_region.extent.height = 1;
12044 copy_region.extent.depth = 1;
12045
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12047 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12048 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012049
Cort530cf382016-12-08 09:59:47 -080012050 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 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012052 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12053 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012054 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12055 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012056 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 -060012057 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012059 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12060 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012061 m_errorMonitor->SetUnexpectedError("srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080012062 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 -060012063 m_errorMonitor->VerifyFound();
12064 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012066 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012067 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012068 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012069 "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 -080012070 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 -060012071 m_errorMonitor->VerifyFound();
12072 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12074 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12075 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012076 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 -060012077 m_errorMonitor->VerifyFound();
12078 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012080 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012081 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012082 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012083 "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 -080012084 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 -060012085 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012087 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12088 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012089 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012090 "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 -080012091 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 -060012092 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012093
Cort3b021012016-12-07 12:00:57 -080012094 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12095 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12096 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12097 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12098 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12099 transfer_dst_image_barrier[0].srcAccessMask = 0;
12100 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12101 transfer_dst_image_barrier[0].image = dst_image;
12102 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12103 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12104 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12105 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12106 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12107 transfer_dst_image_barrier[0].image = depth_image;
12108 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12109 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12110 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12111
12112 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012113 VkClearColorValue color_clear_value = {};
12114 VkImageSubresourceRange clear_range;
12115 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12116 clear_range.baseMipLevel = 0;
12117 clear_range.baseArrayLayer = 0;
12118 clear_range.layerCount = 1;
12119 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012120
Cort3b021012016-12-07 12:00:57 -080012121 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12122 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012125 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012126 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012127 // Fail due to provided layout not matching actual current layout for color clear.
12128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012129 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012130 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012131
Cort530cf382016-12-08 09:59:47 -080012132 VkClearDepthStencilValue depth_clear_value = {};
12133 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012134
12135 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12136 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012139 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012140 m_errorMonitor->VerifyFound();
12141 // Fail due to provided layout not matching actual current layout for depth clear.
12142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012143 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012144 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012145
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012146 // Now cause error due to bad image layout transition in PipelineBarrier
12147 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012148 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012149 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012150 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012151 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012152 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12153 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012154 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012156 "you cannot transition the layout of aspect 1 from "
12157 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12158 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012160 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12161 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012162 m_errorMonitor->VerifyFound();
12163
12164 // Finally some layout errors at RenderPass create time
12165 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12166 VkAttachmentReference attach = {};
12167 // perf warning for GENERAL layout w/ non-DS input attachment
12168 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12169 VkSubpassDescription subpass = {};
12170 subpass.inputAttachmentCount = 1;
12171 subpass.pInputAttachments = &attach;
12172 VkRenderPassCreateInfo rpci = {};
12173 rpci.subpassCount = 1;
12174 rpci.pSubpasses = &subpass;
12175 rpci.attachmentCount = 1;
12176 VkAttachmentDescription attach_desc = {};
12177 attach_desc.format = VK_FORMAT_UNDEFINED;
12178 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012179 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012180 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12182 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012183 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12184 m_errorMonitor->VerifyFound();
12185 // error w/ non-general layout
12186 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12187
12188 m_errorMonitor->SetDesiredFailureMsg(
12189 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12190 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12191 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12192 m_errorMonitor->VerifyFound();
12193 subpass.inputAttachmentCount = 0;
12194 subpass.colorAttachmentCount = 1;
12195 subpass.pColorAttachments = &attach;
12196 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12197 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12199 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012200 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12201 m_errorMonitor->VerifyFound();
12202 // error w/ non-color opt or GENERAL layout for color attachment
12203 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12204 m_errorMonitor->SetDesiredFailureMsg(
12205 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12206 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12207 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12208 m_errorMonitor->VerifyFound();
12209 subpass.colorAttachmentCount = 0;
12210 subpass.pDepthStencilAttachment = &attach;
12211 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12212 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12214 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012215 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12216 m_errorMonitor->VerifyFound();
12217 // error w/ non-ds opt or GENERAL layout for color attachment
12218 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12220 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12221 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012222 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12223 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012224 // For this error we need a valid renderpass so create default one
12225 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12226 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012227 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012228 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12229 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12230 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12231 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12232 // Can't do a CLEAR load on READ_ONLY initialLayout
12233 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12234 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12235 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012237 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012238 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12239 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012240
Cort3b021012016-12-07 12:00:57 -080012241 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12242 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12243 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012244 vkDestroyImage(m_device->device(), src_image, NULL);
12245 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012246 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012247}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012248
Tobin Ehlise0936662016-10-11 08:10:51 -060012249TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12250 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12251 VkResult err;
12252
Tony Barbour1fa09702017-03-16 12:09:08 -060012253 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012254
12255 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12256 VkImageTiling tiling;
12257 VkFormatProperties format_properties;
12258 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12259 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12260 tiling = VK_IMAGE_TILING_LINEAR;
12261 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12262 tiling = VK_IMAGE_TILING_OPTIMAL;
12263 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012264 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012265 return;
12266 }
12267
12268 VkDescriptorPoolSize ds_type = {};
12269 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12270 ds_type.descriptorCount = 1;
12271
12272 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12273 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12274 ds_pool_ci.maxSets = 1;
12275 ds_pool_ci.poolSizeCount = 1;
12276 ds_pool_ci.pPoolSizes = &ds_type;
12277 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12278
12279 VkDescriptorPool ds_pool;
12280 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12281 ASSERT_VK_SUCCESS(err);
12282
12283 VkDescriptorSetLayoutBinding dsl_binding = {};
12284 dsl_binding.binding = 0;
12285 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12286 dsl_binding.descriptorCount = 1;
12287 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12288 dsl_binding.pImmutableSamplers = NULL;
12289
12290 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12291 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12292 ds_layout_ci.pNext = NULL;
12293 ds_layout_ci.bindingCount = 1;
12294 ds_layout_ci.pBindings = &dsl_binding;
12295
12296 VkDescriptorSetLayout ds_layout;
12297 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12298 ASSERT_VK_SUCCESS(err);
12299
12300 VkDescriptorSetAllocateInfo alloc_info = {};
12301 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12302 alloc_info.descriptorSetCount = 1;
12303 alloc_info.descriptorPool = ds_pool;
12304 alloc_info.pSetLayouts = &ds_layout;
12305 VkDescriptorSet descriptor_set;
12306 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12307 ASSERT_VK_SUCCESS(err);
12308
12309 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12310 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12311 pipeline_layout_ci.pNext = NULL;
12312 pipeline_layout_ci.setLayoutCount = 1;
12313 pipeline_layout_ci.pSetLayouts = &ds_layout;
12314 VkPipelineLayout pipeline_layout;
12315 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12316 ASSERT_VK_SUCCESS(err);
12317
12318 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012319 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012320 ASSERT_TRUE(image.initialized());
12321 VkImageView view = image.targetView(tex_format);
12322
12323 VkDescriptorImageInfo image_info = {};
12324 image_info.imageView = view;
12325 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12326
12327 VkWriteDescriptorSet descriptor_write = {};
12328 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12329 descriptor_write.dstSet = descriptor_set;
12330 descriptor_write.dstBinding = 0;
12331 descriptor_write.descriptorCount = 1;
12332 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12333 descriptor_write.pImageInfo = &image_info;
12334
12335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12336 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12337 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12338 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12339 m_errorMonitor->VerifyFound();
12340
12341 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12342 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12343 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12344 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12345}
12346
Mark Mueller93b938f2016-08-18 10:27:40 -060012347TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012348 TEST_DESCRIPTION(
12349 "Use vkCmdExecuteCommands with invalid state "
12350 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012351
Tony Barbour1fa09702017-03-16 12:09:08 -060012352 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12354
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012355 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012356 const char *simultaneous_use_message2 =
12357 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12358 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012359
12360 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012361 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012362 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012363 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12364 command_buffer_allocate_info.commandBufferCount = 1;
12365
12366 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012367 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012368 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12369 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012370 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012371 command_buffer_inheritance_info.renderPass = m_renderPass;
12372 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012373
Mark Mueller93b938f2016-08-18 10:27:40 -060012374 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012375 command_buffer_begin_info.flags =
12376 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012377 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12378
12379 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12380 vkEndCommandBuffer(secondary_command_buffer);
12381
Mark Mueller93b938f2016-08-18 10:27:40 -060012382 VkSubmitInfo submit_info = {};
12383 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12384 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012385 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012386
Mark Mueller4042b652016-09-05 22:52:21 -060012387 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012388 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12390 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012391 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012392 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012393 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12394 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012395
Dave Houltonfbf52152017-01-06 12:55:29 -070012396 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012397 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012398 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012399
Mark Mueller4042b652016-09-05 22:52:21 -060012400 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012401 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012402 m_errorMonitor->SetUnexpectedError(
12403 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12404 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012405 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012406 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012407
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12409 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012410 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012411 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12412 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012413
12414 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012415
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012416 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012417}
12418
Tony Barbour626994c2017-02-08 15:29:37 -070012419TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12420 TEST_DESCRIPTION(
12421 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12422 "errors");
12423 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12424 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 -060012425 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012426
12427 VkCommandBuffer cmd_bufs[2];
12428 VkCommandBufferAllocateInfo alloc_info;
12429 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12430 alloc_info.pNext = NULL;
12431 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012432 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012433 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12434 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12435
12436 VkCommandBufferBeginInfo cb_binfo;
12437 cb_binfo.pNext = NULL;
12438 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12439 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12440 cb_binfo.flags = 0;
12441 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12442 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12443 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12444 vkEndCommandBuffer(cmd_bufs[0]);
12445 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12446
12447 VkSubmitInfo submit_info = {};
12448 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12449 submit_info.commandBufferCount = 2;
12450 submit_info.pCommandBuffers = duplicates;
12451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12452 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12453 m_errorMonitor->VerifyFound();
12454 vkQueueWaitIdle(m_device->m_queue);
12455
12456 // Set one time use and now look for one time submit
12457 duplicates[0] = duplicates[1] = cmd_bufs[1];
12458 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12459 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12460 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12461 vkEndCommandBuffer(cmd_bufs[1]);
12462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12463 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12464 m_errorMonitor->VerifyFound();
12465 vkQueueWaitIdle(m_device->m_queue);
12466}
12467
Tobin Ehlisb093da82017-01-19 12:05:27 -070012468TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012469 TEST_DESCRIPTION(
12470 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12471 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012472
Tony Barbour1fa09702017-03-16 12:09:08 -060012473 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012474 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12475
12476 std::vector<const char *> device_extension_names;
12477 auto features = m_device->phy().features();
12478 // Make sure gs & ts are disabled
12479 features.geometryShader = false;
12480 features.tessellationShader = false;
12481 // The sacrificial device object
12482 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12483
12484 VkCommandPoolCreateInfo pool_create_info{};
12485 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12486 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12487
12488 VkCommandPool command_pool;
12489 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12490
12491 VkCommandBufferAllocateInfo cmd = {};
12492 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12493 cmd.pNext = NULL;
12494 cmd.commandPool = command_pool;
12495 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12496 cmd.commandBufferCount = 1;
12497
12498 VkCommandBuffer cmd_buffer;
12499 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12500 ASSERT_VK_SUCCESS(err);
12501
12502 VkEvent event;
12503 VkEventCreateInfo evci = {};
12504 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12505 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12506 ASSERT_VK_SUCCESS(result);
12507
12508 VkCommandBufferBeginInfo cbbi = {};
12509 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12510 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12512 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12513 m_errorMonitor->VerifyFound();
12514
12515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12516 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12517 m_errorMonitor->VerifyFound();
12518
12519 vkDestroyEvent(test_device.handle(), event, NULL);
12520 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12521}
12522
Chris Forbesd70103a2017-04-13 11:34:09 -070012523TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060012524 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12526
Tony Barbour552f6c02016-12-21 14:34:07 -070012527 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012528
12529 VkEvent event;
12530 VkEventCreateInfo event_create_info = {};
12531 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12532 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012533 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012534
Tony Barbour552f6c02016-12-21 14:34:07 -070012535 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012536 vkDestroyEvent(m_device->device(), event, nullptr);
12537
12538 VkSubmitInfo submit_info = {};
12539 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12540 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012541 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012543 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12544 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070012545}
Mark Muellerc8d441e2016-08-23 17:36:00 -060012546
Chris Forbesd70103a2017-04-13 11:34:09 -070012547TEST_F(VkLayerTest, InUseDestroyedSignaled) {
12548 TEST_DESCRIPTION(
12549 "Use vkCmdExecuteCommands with invalid state "
12550 "in primary and secondary command buffers. "
12551 "Delete objects that are inuse. Call VkQueueSubmit "
12552 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012553
Chris Forbesd70103a2017-04-13 11:34:09 -070012554 ASSERT_NO_FATAL_FAILURE(Init());
12555 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12556
12557 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012558
Mark Mueller917f6bc2016-08-30 10:57:19 -060012559 VkSemaphoreCreateInfo semaphore_create_info = {};
12560 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12561 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012562 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012563 VkFenceCreateInfo fence_create_info = {};
12564 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12565 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012566 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012567
12568 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012569 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012570 descriptor_pool_type_count.descriptorCount = 1;
12571
12572 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12573 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12574 descriptor_pool_create_info.maxSets = 1;
12575 descriptor_pool_create_info.poolSizeCount = 1;
12576 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012577 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012578
12579 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012580 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012581
12582 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012583 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012584 descriptorset_layout_binding.descriptorCount = 1;
12585 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12586
12587 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012588 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012589 descriptorset_layout_create_info.bindingCount = 1;
12590 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12591
12592 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012593 ASSERT_VK_SUCCESS(
12594 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012595
12596 VkDescriptorSet descriptorset;
12597 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012598 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012599 descriptorset_allocate_info.descriptorSetCount = 1;
12600 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12601 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012602 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012603
Mark Mueller4042b652016-09-05 22:52:21 -060012604 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12605
12606 VkDescriptorBufferInfo buffer_info = {};
12607 buffer_info.buffer = buffer_test.GetBuffer();
12608 buffer_info.offset = 0;
12609 buffer_info.range = 1024;
12610
12611 VkWriteDescriptorSet write_descriptor_set = {};
12612 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12613 write_descriptor_set.dstSet = descriptorset;
12614 write_descriptor_set.descriptorCount = 1;
12615 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12616 write_descriptor_set.pBufferInfo = &buffer_info;
12617
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012618 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012619
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012620 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12621 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012622
12623 VkPipelineObj pipe(m_device);
12624 pipe.AddColorAttachment();
12625 pipe.AddShader(&vs);
12626 pipe.AddShader(&fs);
12627
12628 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012629 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012630 pipeline_layout_create_info.setLayoutCount = 1;
12631 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12632
12633 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012634 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012635
12636 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12637
Chris Forbesd70103a2017-04-13 11:34:09 -070012638 VkEvent event;
12639 VkEventCreateInfo event_create_info = {};
12640 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12641 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12642
Tony Barbour552f6c02016-12-21 14:34:07 -070012643 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070012644
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012645 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012646
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012647 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12648 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12649 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012650
Tony Barbour552f6c02016-12-21 14:34:07 -070012651 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012652
Chris Forbesd70103a2017-04-13 11:34:09 -070012653 VkSubmitInfo submit_info = {};
12654 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12655 submit_info.commandBufferCount = 1;
12656 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012657 submit_info.signalSemaphoreCount = 1;
12658 submit_info.pSignalSemaphores = &semaphore;
12659 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012660 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012661
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012663 vkDestroyEvent(m_device->device(), event, nullptr);
12664 m_errorMonitor->VerifyFound();
12665
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012667 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12668 m_errorMonitor->VerifyFound();
12669
Jeremy Hayes08369882017-02-02 10:31:06 -070012670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012671 vkDestroyFence(m_device->device(), fence, nullptr);
12672 m_errorMonitor->VerifyFound();
12673
Tobin Ehlis122207b2016-09-01 08:50:06 -070012674 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012675 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12676 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012677 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012678 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12679 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012680 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012681 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12682 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012683 vkDestroyEvent(m_device->device(), event, nullptr);
12684 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012685 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012686 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12687}
12688
Tobin Ehlis2adda372016-09-01 08:51:06 -070012689TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12690 TEST_DESCRIPTION("Delete in-use query pool.");
12691
Tony Barbour1fa09702017-03-16 12:09:08 -060012692 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12694
12695 VkQueryPool query_pool;
12696 VkQueryPoolCreateInfo query_pool_ci{};
12697 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12698 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12699 query_pool_ci.queryCount = 1;
12700 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012701 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012702 // Reset query pool to create binding with cmd buffer
12703 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12704
Tony Barbour552f6c02016-12-21 14:34:07 -070012705 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012706
12707 VkSubmitInfo submit_info = {};
12708 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12709 submit_info.commandBufferCount = 1;
12710 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12711 // Submit cmd buffer and then destroy query pool while in-flight
12712 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12713
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012715 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12716 m_errorMonitor->VerifyFound();
12717
12718 vkQueueWaitIdle(m_device->m_queue);
12719 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012720 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012721 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012722 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12723}
12724
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012725TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12726 TEST_DESCRIPTION("Delete in-use pipeline.");
12727
Tony Barbour1fa09702017-03-16 12:09:08 -060012728 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012729 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12730
12731 // Empty pipeline layout used for binding PSO
12732 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12733 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12734 pipeline_layout_ci.setLayoutCount = 0;
12735 pipeline_layout_ci.pSetLayouts = NULL;
12736
12737 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012738 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012739 ASSERT_VK_SUCCESS(err);
12740
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012742 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012743 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12744 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012745 // Store pipeline handle so we can actually delete it before test finishes
12746 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012747 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012748 VkPipelineObj pipe(m_device);
12749 pipe.AddShader(&vs);
12750 pipe.AddShader(&fs);
12751 pipe.AddColorAttachment();
12752 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12753 delete_this_pipeline = pipe.handle();
12754
Tony Barbour552f6c02016-12-21 14:34:07 -070012755 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012756 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012757 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012758
Tony Barbour552f6c02016-12-21 14:34:07 -070012759 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012760
12761 VkSubmitInfo submit_info = {};
12762 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12763 submit_info.commandBufferCount = 1;
12764 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12765 // Submit cmd buffer and then pipeline destroyed while in-flight
12766 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012767 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012768 m_errorMonitor->VerifyFound();
12769 // Make sure queue finished and then actually delete pipeline
12770 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012771 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12772 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012773 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12774 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12775}
12776
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012777TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12778 TEST_DESCRIPTION("Delete in-use imageView.");
12779
Tony Barbour1fa09702017-03-16 12:09:08 -060012780 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012781 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12782
12783 VkDescriptorPoolSize ds_type_count;
12784 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12785 ds_type_count.descriptorCount = 1;
12786
12787 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12788 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12789 ds_pool_ci.maxSets = 1;
12790 ds_pool_ci.poolSizeCount = 1;
12791 ds_pool_ci.pPoolSizes = &ds_type_count;
12792
12793 VkDescriptorPool ds_pool;
12794 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12795 ASSERT_VK_SUCCESS(err);
12796
12797 VkSamplerCreateInfo sampler_ci = {};
12798 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12799 sampler_ci.pNext = NULL;
12800 sampler_ci.magFilter = VK_FILTER_NEAREST;
12801 sampler_ci.minFilter = VK_FILTER_NEAREST;
12802 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12803 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12804 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12805 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12806 sampler_ci.mipLodBias = 1.0;
12807 sampler_ci.anisotropyEnable = VK_FALSE;
12808 sampler_ci.maxAnisotropy = 1;
12809 sampler_ci.compareEnable = VK_FALSE;
12810 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12811 sampler_ci.minLod = 1.0;
12812 sampler_ci.maxLod = 1.0;
12813 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12814 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12815 VkSampler sampler;
12816
12817 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12818 ASSERT_VK_SUCCESS(err);
12819
12820 VkDescriptorSetLayoutBinding layout_binding;
12821 layout_binding.binding = 0;
12822 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12823 layout_binding.descriptorCount = 1;
12824 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12825 layout_binding.pImmutableSamplers = NULL;
12826
12827 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12828 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12829 ds_layout_ci.bindingCount = 1;
12830 ds_layout_ci.pBindings = &layout_binding;
12831 VkDescriptorSetLayout ds_layout;
12832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12833 ASSERT_VK_SUCCESS(err);
12834
12835 VkDescriptorSetAllocateInfo alloc_info = {};
12836 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12837 alloc_info.descriptorSetCount = 1;
12838 alloc_info.descriptorPool = ds_pool;
12839 alloc_info.pSetLayouts = &ds_layout;
12840 VkDescriptorSet descriptor_set;
12841 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12842 ASSERT_VK_SUCCESS(err);
12843
12844 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12845 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12846 pipeline_layout_ci.pNext = NULL;
12847 pipeline_layout_ci.setLayoutCount = 1;
12848 pipeline_layout_ci.pSetLayouts = &ds_layout;
12849
12850 VkPipelineLayout pipeline_layout;
12851 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12852 ASSERT_VK_SUCCESS(err);
12853
12854 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012855 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 -060012856 ASSERT_TRUE(image.initialized());
12857
12858 VkImageView view;
12859 VkImageViewCreateInfo ivci = {};
12860 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12861 ivci.image = image.handle();
12862 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12863 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12864 ivci.subresourceRange.layerCount = 1;
12865 ivci.subresourceRange.baseMipLevel = 0;
12866 ivci.subresourceRange.levelCount = 1;
12867 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12868
12869 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12870 ASSERT_VK_SUCCESS(err);
12871
12872 VkDescriptorImageInfo image_info{};
12873 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12874 image_info.imageView = view;
12875 image_info.sampler = sampler;
12876
12877 VkWriteDescriptorSet descriptor_write = {};
12878 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12879 descriptor_write.dstSet = descriptor_set;
12880 descriptor_write.dstBinding = 0;
12881 descriptor_write.descriptorCount = 1;
12882 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12883 descriptor_write.pImageInfo = &image_info;
12884
12885 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12886
12887 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012888 char const *vsSource =
12889 "#version 450\n"
12890 "\n"
12891 "out gl_PerVertex { \n"
12892 " vec4 gl_Position;\n"
12893 "};\n"
12894 "void main(){\n"
12895 " gl_Position = vec4(1);\n"
12896 "}\n";
12897 char const *fsSource =
12898 "#version 450\n"
12899 "\n"
12900 "layout(set=0, binding=0) uniform sampler2D s;\n"
12901 "layout(location=0) out vec4 x;\n"
12902 "void main(){\n"
12903 " x = texture(s, vec2(1));\n"
12904 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012905 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12906 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12907 VkPipelineObj pipe(m_device);
12908 pipe.AddShader(&vs);
12909 pipe.AddShader(&fs);
12910 pipe.AddColorAttachment();
12911 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12912
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012914
Tony Barbour552f6c02016-12-21 14:34:07 -070012915 m_commandBuffer->BeginCommandBuffer();
12916 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012917 // Bind pipeline to cmd buffer
12918 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12919 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12920 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012921
12922 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12923 VkRect2D scissor = {{0, 0}, {16, 16}};
12924 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12925 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12926
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012927 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012928 m_commandBuffer->EndRenderPass();
12929 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012930 // Submit cmd buffer then destroy sampler
12931 VkSubmitInfo submit_info = {};
12932 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12933 submit_info.commandBufferCount = 1;
12934 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12935 // Submit cmd buffer and then destroy imageView while in-flight
12936 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12937
12938 vkDestroyImageView(m_device->device(), view, nullptr);
12939 m_errorMonitor->VerifyFound();
12940 vkQueueWaitIdle(m_device->m_queue);
12941 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012942 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012943 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012944 vkDestroyImageView(m_device->device(), view, NULL);
12945 vkDestroySampler(m_device->device(), sampler, nullptr);
12946 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12947 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12948 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12949}
12950
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012951TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12952 TEST_DESCRIPTION("Delete in-use bufferView.");
12953
Tony Barbour1fa09702017-03-16 12:09:08 -060012954 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012955 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12956
12957 VkDescriptorPoolSize ds_type_count;
12958 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12959 ds_type_count.descriptorCount = 1;
12960
12961 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12962 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12963 ds_pool_ci.maxSets = 1;
12964 ds_pool_ci.poolSizeCount = 1;
12965 ds_pool_ci.pPoolSizes = &ds_type_count;
12966
12967 VkDescriptorPool ds_pool;
12968 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12969 ASSERT_VK_SUCCESS(err);
12970
12971 VkDescriptorSetLayoutBinding layout_binding;
12972 layout_binding.binding = 0;
12973 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12974 layout_binding.descriptorCount = 1;
12975 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12976 layout_binding.pImmutableSamplers = NULL;
12977
12978 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12979 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12980 ds_layout_ci.bindingCount = 1;
12981 ds_layout_ci.pBindings = &layout_binding;
12982 VkDescriptorSetLayout ds_layout;
12983 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12984 ASSERT_VK_SUCCESS(err);
12985
12986 VkDescriptorSetAllocateInfo alloc_info = {};
12987 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12988 alloc_info.descriptorSetCount = 1;
12989 alloc_info.descriptorPool = ds_pool;
12990 alloc_info.pSetLayouts = &ds_layout;
12991 VkDescriptorSet descriptor_set;
12992 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12993 ASSERT_VK_SUCCESS(err);
12994
12995 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12996 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12997 pipeline_layout_ci.pNext = NULL;
12998 pipeline_layout_ci.setLayoutCount = 1;
12999 pipeline_layout_ci.pSetLayouts = &ds_layout;
13000
13001 VkPipelineLayout pipeline_layout;
13002 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13003 ASSERT_VK_SUCCESS(err);
13004
13005 VkBuffer buffer;
13006 uint32_t queue_family_index = 0;
13007 VkBufferCreateInfo buffer_create_info = {};
13008 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
13009 buffer_create_info.size = 1024;
13010 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13011 buffer_create_info.queueFamilyIndexCount = 1;
13012 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13013
13014 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13015 ASSERT_VK_SUCCESS(err);
13016
13017 VkMemoryRequirements memory_reqs;
13018 VkDeviceMemory buffer_memory;
13019
13020 VkMemoryAllocateInfo memory_info = {};
13021 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13022 memory_info.allocationSize = 0;
13023 memory_info.memoryTypeIndex = 0;
13024
13025 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13026 memory_info.allocationSize = memory_reqs.size;
13027 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13028 ASSERT_TRUE(pass);
13029
13030 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13031 ASSERT_VK_SUCCESS(err);
13032 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13033 ASSERT_VK_SUCCESS(err);
13034
13035 VkBufferView view;
13036 VkBufferViewCreateInfo bvci = {};
13037 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13038 bvci.buffer = buffer;
13039 bvci.format = VK_FORMAT_R8_UNORM;
13040 bvci.range = VK_WHOLE_SIZE;
13041
13042 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13043 ASSERT_VK_SUCCESS(err);
13044
13045 VkWriteDescriptorSet descriptor_write = {};
13046 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13047 descriptor_write.dstSet = descriptor_set;
13048 descriptor_write.dstBinding = 0;
13049 descriptor_write.descriptorCount = 1;
13050 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13051 descriptor_write.pTexelBufferView = &view;
13052
13053 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13054
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013055 char const *vsSource =
13056 "#version 450\n"
13057 "\n"
13058 "out gl_PerVertex { \n"
13059 " vec4 gl_Position;\n"
13060 "};\n"
13061 "void main(){\n"
13062 " gl_Position = vec4(1);\n"
13063 "}\n";
13064 char const *fsSource =
13065 "#version 450\n"
13066 "\n"
13067 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13068 "layout(location=0) out vec4 x;\n"
13069 "void main(){\n"
13070 " x = imageLoad(s, 0);\n"
13071 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013072 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13073 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13074 VkPipelineObj pipe(m_device);
13075 pipe.AddShader(&vs);
13076 pipe.AddShader(&fs);
13077 pipe.AddColorAttachment();
13078 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13079
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013081
Tony Barbour552f6c02016-12-21 14:34:07 -070013082 m_commandBuffer->BeginCommandBuffer();
13083 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013084 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13085 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13086 VkRect2D scissor = {{0, 0}, {16, 16}};
13087 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13088 // Bind pipeline to cmd buffer
13089 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13090 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13091 &descriptor_set, 0, nullptr);
13092 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013093 m_commandBuffer->EndRenderPass();
13094 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013095
13096 VkSubmitInfo submit_info = {};
13097 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13098 submit_info.commandBufferCount = 1;
13099 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13100 // Submit cmd buffer and then destroy bufferView while in-flight
13101 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13102
13103 vkDestroyBufferView(m_device->device(), view, nullptr);
13104 m_errorMonitor->VerifyFound();
13105 vkQueueWaitIdle(m_device->m_queue);
13106 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013107 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013108 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013109 vkDestroyBufferView(m_device->device(), view, NULL);
13110 vkDestroyBuffer(m_device->device(), buffer, NULL);
13111 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13112 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13113 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13114 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13115}
13116
Tobin Ehlis209532e2016-09-07 13:52:18 -060013117TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13118 TEST_DESCRIPTION("Delete in-use sampler.");
13119
Tony Barbour1fa09702017-03-16 12:09:08 -060013120 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013121 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13122
13123 VkDescriptorPoolSize ds_type_count;
13124 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13125 ds_type_count.descriptorCount = 1;
13126
13127 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13128 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13129 ds_pool_ci.maxSets = 1;
13130 ds_pool_ci.poolSizeCount = 1;
13131 ds_pool_ci.pPoolSizes = &ds_type_count;
13132
13133 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013134 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013135 ASSERT_VK_SUCCESS(err);
13136
13137 VkSamplerCreateInfo sampler_ci = {};
13138 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13139 sampler_ci.pNext = NULL;
13140 sampler_ci.magFilter = VK_FILTER_NEAREST;
13141 sampler_ci.minFilter = VK_FILTER_NEAREST;
13142 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13143 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13144 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13145 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13146 sampler_ci.mipLodBias = 1.0;
13147 sampler_ci.anisotropyEnable = VK_FALSE;
13148 sampler_ci.maxAnisotropy = 1;
13149 sampler_ci.compareEnable = VK_FALSE;
13150 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13151 sampler_ci.minLod = 1.0;
13152 sampler_ci.maxLod = 1.0;
13153 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13154 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13155 VkSampler sampler;
13156
13157 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13158 ASSERT_VK_SUCCESS(err);
13159
13160 VkDescriptorSetLayoutBinding layout_binding;
13161 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013162 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013163 layout_binding.descriptorCount = 1;
13164 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13165 layout_binding.pImmutableSamplers = NULL;
13166
13167 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13168 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13169 ds_layout_ci.bindingCount = 1;
13170 ds_layout_ci.pBindings = &layout_binding;
13171 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013172 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013173 ASSERT_VK_SUCCESS(err);
13174
13175 VkDescriptorSetAllocateInfo alloc_info = {};
13176 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13177 alloc_info.descriptorSetCount = 1;
13178 alloc_info.descriptorPool = ds_pool;
13179 alloc_info.pSetLayouts = &ds_layout;
13180 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013181 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013182 ASSERT_VK_SUCCESS(err);
13183
13184 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13185 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13186 pipeline_layout_ci.pNext = NULL;
13187 pipeline_layout_ci.setLayoutCount = 1;
13188 pipeline_layout_ci.pSetLayouts = &ds_layout;
13189
13190 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013191 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013192 ASSERT_VK_SUCCESS(err);
13193
13194 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013195 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 -060013196 ASSERT_TRUE(image.initialized());
13197
13198 VkImageView view;
13199 VkImageViewCreateInfo ivci = {};
13200 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13201 ivci.image = image.handle();
13202 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13203 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13204 ivci.subresourceRange.layerCount = 1;
13205 ivci.subresourceRange.baseMipLevel = 0;
13206 ivci.subresourceRange.levelCount = 1;
13207 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13208
13209 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13210 ASSERT_VK_SUCCESS(err);
13211
13212 VkDescriptorImageInfo image_info{};
13213 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13214 image_info.imageView = view;
13215 image_info.sampler = sampler;
13216
13217 VkWriteDescriptorSet descriptor_write = {};
13218 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13219 descriptor_write.dstSet = descriptor_set;
13220 descriptor_write.dstBinding = 0;
13221 descriptor_write.descriptorCount = 1;
13222 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13223 descriptor_write.pImageInfo = &image_info;
13224
13225 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13226
13227 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013228 char const *vsSource =
13229 "#version 450\n"
13230 "\n"
13231 "out gl_PerVertex { \n"
13232 " vec4 gl_Position;\n"
13233 "};\n"
13234 "void main(){\n"
13235 " gl_Position = vec4(1);\n"
13236 "}\n";
13237 char const *fsSource =
13238 "#version 450\n"
13239 "\n"
13240 "layout(set=0, binding=0) uniform sampler2D s;\n"
13241 "layout(location=0) out vec4 x;\n"
13242 "void main(){\n"
13243 " x = texture(s, vec2(1));\n"
13244 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013245 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13246 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13247 VkPipelineObj pipe(m_device);
13248 pipe.AddShader(&vs);
13249 pipe.AddShader(&fs);
13250 pipe.AddColorAttachment();
13251 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13252
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013254
Tony Barbour552f6c02016-12-21 14:34:07 -070013255 m_commandBuffer->BeginCommandBuffer();
13256 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013257 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013258 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13259 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13260 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013261
13262 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13263 VkRect2D scissor = {{0, 0}, {16, 16}};
13264 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13265 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13266
Tobin Ehlis209532e2016-09-07 13:52:18 -060013267 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013268 m_commandBuffer->EndRenderPass();
13269 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013270 // Submit cmd buffer then destroy sampler
13271 VkSubmitInfo submit_info = {};
13272 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13273 submit_info.commandBufferCount = 1;
13274 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13275 // Submit cmd buffer and then destroy sampler while in-flight
13276 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13277
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013278 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013279 m_errorMonitor->VerifyFound();
13280 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013281
Tobin Ehlis209532e2016-09-07 13:52:18 -060013282 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013283 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13284 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013285 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013286 vkDestroyImageView(m_device->device(), view, NULL);
13287 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13288 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13289 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13290}
13291
Mark Mueller1cd9f412016-08-25 13:23:52 -060013292TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013293 TEST_DESCRIPTION(
13294 "Call VkQueueSubmit with a semaphore that is already "
13295 "signaled but not waited on by the queue. Wait on a "
13296 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013297
Tony Barbour1fa09702017-03-16 12:09:08 -060013298 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013299 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13300
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013301 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 -070013302 const char *invalid_fence_wait_message =
13303 " which has not been submitted on a Queue or during "
13304 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013305
Tony Barbour552f6c02016-12-21 14:34:07 -070013306 m_commandBuffer->BeginCommandBuffer();
13307 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013308
13309 VkSemaphoreCreateInfo semaphore_create_info = {};
13310 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13311 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013312 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013313 VkSubmitInfo submit_info = {};
13314 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13315 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013316 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013317 submit_info.signalSemaphoreCount = 1;
13318 submit_info.pSignalSemaphores = &semaphore;
13319 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013320 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013321 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013322 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013323 m_commandBuffer->BeginCommandBuffer();
13324 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013326 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13327 m_errorMonitor->VerifyFound();
13328
Mark Mueller1cd9f412016-08-25 13:23:52 -060013329 VkFenceCreateInfo fence_create_info = {};
13330 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13331 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013332 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013333
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013335 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13336 m_errorMonitor->VerifyFound();
13337
Mark Mueller4042b652016-09-05 22:52:21 -060013338 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013339 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013340 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13341}
13342
Tobin Ehlis4af23302016-07-19 10:50:30 -060013343TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013344 TEST_DESCRIPTION(
13345 "Bind a secondary command buffer with with a framebuffer "
13346 "that does not match the framebuffer for the active "
13347 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013348 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013349 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13350
13351 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013352 VkAttachmentDescription attachment = {0,
13353 VK_FORMAT_B8G8R8A8_UNORM,
13354 VK_SAMPLE_COUNT_1_BIT,
13355 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13356 VK_ATTACHMENT_STORE_OP_STORE,
13357 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13358 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13359 VK_IMAGE_LAYOUT_UNDEFINED,
13360 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013361
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013362 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013363
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013364 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013365
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013366 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013367
13368 VkRenderPass rp;
13369 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13370 ASSERT_VK_SUCCESS(err);
13371
13372 // A compatible framebuffer.
13373 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013374 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 -060013375 ASSERT_TRUE(image.initialized());
13376
13377 VkImageViewCreateInfo ivci = {
13378 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13379 nullptr,
13380 0,
13381 image.handle(),
13382 VK_IMAGE_VIEW_TYPE_2D,
13383 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013384 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13385 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013386 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13387 };
13388 VkImageView view;
13389 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13390 ASSERT_VK_SUCCESS(err);
13391
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013392 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013393 VkFramebuffer fb;
13394 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13395 ASSERT_VK_SUCCESS(err);
13396
13397 VkCommandBufferAllocateInfo cbai = {};
13398 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013399 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013400 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13401 cbai.commandBufferCount = 1;
13402
13403 VkCommandBuffer sec_cb;
13404 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13405 ASSERT_VK_SUCCESS(err);
13406 VkCommandBufferBeginInfo cbbi = {};
13407 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013408 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013409 cbii.renderPass = renderPass();
13410 cbii.framebuffer = fb;
13411 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13412 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013413 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 -060013414 cbbi.pInheritanceInfo = &cbii;
13415 vkBeginCommandBuffer(sec_cb, &cbbi);
13416 vkEndCommandBuffer(sec_cb);
13417
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013418 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013419 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13420 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013421
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013423 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013424 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13425 m_errorMonitor->VerifyFound();
13426 // Cleanup
13427 vkDestroyImageView(m_device->device(), view, NULL);
13428 vkDestroyRenderPass(m_device->device(), rp, NULL);
13429 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13430}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013431
13432TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013433 TEST_DESCRIPTION(
13434 "If logicOp is available on the device, set it to an "
13435 "invalid value. If logicOp is not available, attempt to "
13436 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013437 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13439
13440 auto features = m_device->phy().features();
13441 // Set the expected error depending on whether or not logicOp available
13442 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13444 "If logic operations feature not "
13445 "enabled, logicOpEnable must be "
13446 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013447 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013449 }
13450 // Create a pipeline using logicOp
13451 VkResult err;
13452
13453 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13454 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13455
13456 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013457 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013458 ASSERT_VK_SUCCESS(err);
13459
13460 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13461 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13462 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013463 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013464 vp_state_ci.pViewports = &vp;
13465 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013466 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013467 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013468
13469 VkPipelineShaderStageCreateInfo shaderStages[2];
13470 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13471
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013472 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13473 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013474 shaderStages[0] = vs.GetStageCreateInfo();
13475 shaderStages[1] = fs.GetStageCreateInfo();
13476
13477 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13478 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13479
13480 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13481 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13482 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13483
13484 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13485 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013486 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013487
13488 VkPipelineColorBlendAttachmentState att = {};
13489 att.blendEnable = VK_FALSE;
13490 att.colorWriteMask = 0xf;
13491
13492 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13493 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13494 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13495 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013496 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013497 cb_ci.attachmentCount = 1;
13498 cb_ci.pAttachments = &att;
13499
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013500 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13501 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13502 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13503
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013504 VkGraphicsPipelineCreateInfo gp_ci = {};
13505 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13506 gp_ci.stageCount = 2;
13507 gp_ci.pStages = shaderStages;
13508 gp_ci.pVertexInputState = &vi_ci;
13509 gp_ci.pInputAssemblyState = &ia_ci;
13510 gp_ci.pViewportState = &vp_state_ci;
13511 gp_ci.pRasterizationState = &rs_ci;
13512 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013513 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013514 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13515 gp_ci.layout = pipeline_layout;
13516 gp_ci.renderPass = renderPass();
13517
13518 VkPipelineCacheCreateInfo pc_ci = {};
13519 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13520
13521 VkPipeline pipeline;
13522 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013523 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013524 ASSERT_VK_SUCCESS(err);
13525
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013526 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013527 m_errorMonitor->VerifyFound();
13528 if (VK_SUCCESS == err) {
13529 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13530 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013531 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13532 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13533}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013534
Mike Stroyanaccf7692015-05-12 16:00:45 -060013535#if GTEST_IS_THREADSAFE
13536struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013537 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013538 VkEvent event;
13539 bool bailout;
13540};
13541
Karl Schultz6addd812016-02-02 17:17:23 -070013542extern "C" void *AddToCommandBuffer(void *arg) {
13543 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013544
Mike Stroyana6d14942016-07-13 15:10:05 -060013545 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013546 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013547 if (data->bailout) {
13548 break;
13549 }
13550 }
13551 return NULL;
13552}
13553
Karl Schultz6addd812016-02-02 17:17:23 -070013554TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013555 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013556
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013558
Tony Barbour1fa09702017-03-16 12:09:08 -060013559 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013560 ASSERT_NO_FATAL_FAILURE(InitViewport());
13561 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13562
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013563 // Calls AllocateCommandBuffers
13564 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013565
13566 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013567 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013568
13569 VkEventCreateInfo event_info;
13570 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013571 VkResult err;
13572
13573 memset(&event_info, 0, sizeof(event_info));
13574 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13575
Chia-I Wuf7458c52015-10-26 21:10:41 +080013576 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013577 ASSERT_VK_SUCCESS(err);
13578
Mike Stroyanaccf7692015-05-12 16:00:45 -060013579 err = vkResetEvent(device(), event);
13580 ASSERT_VK_SUCCESS(err);
13581
13582 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013583 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013584 data.event = event;
13585 data.bailout = false;
13586 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013587
13588 // First do some correct operations using multiple threads.
13589 // Add many entries to command buffer from another thread.
13590 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13591 // Make non-conflicting calls from this thread at the same time.
13592 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013593 uint32_t count;
13594 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013595 }
13596 test_platform_thread_join(thread, NULL);
13597
13598 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013599 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013600 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013601 // Add many entries to command buffer from this thread at the same time.
13602 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013603
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013604 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013605 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013606
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013607 m_errorMonitor->SetBailout(NULL);
13608
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013609 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013610
Chia-I Wuf7458c52015-10-26 21:10:41 +080013611 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013612}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013613#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013614
Karl Schultz6addd812016-02-02 17:17:23 -070013615TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013616 TEST_DESCRIPTION(
13617 "Test that an error is produced for a spirv module "
13618 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013619
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013621
Tony Barbour1fa09702017-03-16 12:09:08 -060013622 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013623 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13624
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013625 VkShaderModule module;
13626 VkShaderModuleCreateInfo moduleCreateInfo;
13627 struct icd_spv_header spv;
13628
13629 spv.magic = ICD_SPV_MAGIC;
13630 spv.version = ICD_SPV_VERSION;
13631 spv.gen_magic = 0;
13632
13633 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13634 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013635 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013636 moduleCreateInfo.codeSize = 4;
13637 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013638 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013639
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013640 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013641}
13642
Karl Schultz6addd812016-02-02 17:17:23 -070013643TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013644 TEST_DESCRIPTION(
13645 "Test that an error is produced for a spirv module "
13646 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013647
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013649
Tony Barbour1fa09702017-03-16 12:09:08 -060013650 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13652
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013653 VkShaderModule module;
13654 VkShaderModuleCreateInfo moduleCreateInfo;
13655 struct icd_spv_header spv;
13656
13657 spv.magic = ~ICD_SPV_MAGIC;
13658 spv.version = ICD_SPV_VERSION;
13659 spv.gen_magic = 0;
13660
13661 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13662 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013663 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013664 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13665 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013666 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013667
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013668 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013669}
13670
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013671#if 0
13672// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013673TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013675 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013676
Tony Barbour1fa09702017-03-16 12:09:08 -060013677 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013678 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13679
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013680 VkShaderModule module;
13681 VkShaderModuleCreateInfo moduleCreateInfo;
13682 struct icd_spv_header spv;
13683
13684 spv.magic = ICD_SPV_MAGIC;
13685 spv.version = ~ICD_SPV_VERSION;
13686 spv.gen_magic = 0;
13687
13688 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13689 moduleCreateInfo.pNext = NULL;
13690
Karl Schultz6addd812016-02-02 17:17:23 -070013691 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013692 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13693 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013694 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013695
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013696 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013697}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013698#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013699
Karl Schultz6addd812016-02-02 17:17:23 -070013700TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013701 TEST_DESCRIPTION(
13702 "Test that a warning is produced for a vertex output that "
13703 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013705
Tony Barbour1fa09702017-03-16 12:09:08 -060013706 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013708
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013709 char const *vsSource =
13710 "#version 450\n"
13711 "\n"
13712 "layout(location=0) out float x;\n"
13713 "out gl_PerVertex {\n"
13714 " vec4 gl_Position;\n"
13715 "};\n"
13716 "void main(){\n"
13717 " gl_Position = vec4(1);\n"
13718 " x = 0;\n"
13719 "}\n";
13720 char const *fsSource =
13721 "#version 450\n"
13722 "\n"
13723 "layout(location=0) out vec4 color;\n"
13724 "void main(){\n"
13725 " color = vec4(1);\n"
13726 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013727
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013728 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13729 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013730
13731 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013732 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013733 pipe.AddShader(&vs);
13734 pipe.AddShader(&fs);
13735
Chris Forbes9f7ff632015-05-25 11:13:08 +120013736 VkDescriptorSetObj descriptorSet(m_device);
13737 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013738 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013739
Tony Barbour5781e8f2015-08-04 16:23:11 -060013740 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013741
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013742 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013743}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013744
Mark Mueller098c9cb2016-09-08 09:01:57 -060013745TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13746 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13747
Tony Barbour1fa09702017-03-16 12:09:08 -060013748 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013749 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13750
13751 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013752 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013753
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013754 char const *vsSource =
13755 "#version 450\n"
13756 "\n"
13757 "out gl_PerVertex {\n"
13758 " vec4 gl_Position;\n"
13759 "};\n"
13760 "void main(){\n"
13761 " gl_Position = vec4(1);\n"
13762 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013763
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013764 char const *fsSource =
13765 "#version 450\n"
13766 "\n"
13767 "layout (constant_id = 0) const float r = 0.0f;\n"
13768 "layout(location = 0) out vec4 uFragColor;\n"
13769 "void main(){\n"
13770 " uFragColor = vec4(r,1,0,1);\n"
13771 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013772
13773 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13774 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13775
13776 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13777 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13778
13779 VkPipelineLayout pipeline_layout;
13780 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13781
13782 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13783 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13784 vp_state_create_info.viewportCount = 1;
13785 VkViewport viewport = {};
13786 vp_state_create_info.pViewports = &viewport;
13787 vp_state_create_info.scissorCount = 1;
13788 VkRect2D scissors = {};
13789 vp_state_create_info.pScissors = &scissors;
13790
13791 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13792
13793 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13794 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13795 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13796 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13797
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013798 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013799
13800 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13801 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13802
13803 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13804 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13805 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13806
13807 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13808 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13809 rasterization_state_create_info.pNext = nullptr;
13810 rasterization_state_create_info.lineWidth = 1.0f;
13811 rasterization_state_create_info.rasterizerDiscardEnable = true;
13812
13813 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13814 color_blend_attachment_state.blendEnable = VK_FALSE;
13815 color_blend_attachment_state.colorWriteMask = 0xf;
13816
13817 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13818 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13819 color_blend_state_create_info.attachmentCount = 1;
13820 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13821
13822 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13823 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13824 graphicspipe_create_info.stageCount = 2;
13825 graphicspipe_create_info.pStages = shader_stage_create_info;
13826 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13827 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13828 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13829 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13830 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13831 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13832 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13833 graphicspipe_create_info.layout = pipeline_layout;
13834 graphicspipe_create_info.renderPass = renderPass();
13835
13836 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13837 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13838
13839 VkPipelineCache pipelineCache;
13840 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13841
13842 // This structure maps constant ids to data locations.
13843 const VkSpecializationMapEntry entry =
13844 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013845 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013846
13847 uint32_t data = 1;
13848
13849 // Set up the info describing spec map and data
13850 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013851 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013852 };
13853 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13854
13855 VkPipeline pipeline;
13856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13857 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13858 m_errorMonitor->VerifyFound();
13859
13860 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13861 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13862}
13863
13864TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13865 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13866
Tony Barbour1fa09702017-03-16 12:09:08 -060013867 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013868 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13869
13870 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13871
13872 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13873 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13874 descriptor_pool_type_count[0].descriptorCount = 1;
13875 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13876 descriptor_pool_type_count[1].descriptorCount = 1;
13877
13878 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13879 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13880 descriptor_pool_create_info.maxSets = 1;
13881 descriptor_pool_create_info.poolSizeCount = 2;
13882 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13883 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13884
13885 VkDescriptorPool descriptorset_pool;
13886 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13887
13888 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13889 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13890 descriptorset_layout_binding.descriptorCount = 1;
13891 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013892 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013893
13894 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13895 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13896 descriptorset_layout_create_info.bindingCount = 1;
13897 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13898
13899 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013900 ASSERT_VK_SUCCESS(
13901 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013902
13903 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13904 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13905 descriptorset_allocate_info.descriptorSetCount = 1;
13906 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13907 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13908 VkDescriptorSet descriptorset;
13909 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13910
13911 // Challenge core_validation with a non uniform buffer type.
13912 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13913
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013914 char const *vsSource =
13915 "#version 450\n"
13916 "\n"
13917 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13918 " mat4 mvp;\n"
13919 "} ubuf;\n"
13920 "out gl_PerVertex {\n"
13921 " vec4 gl_Position;\n"
13922 "};\n"
13923 "void main(){\n"
13924 " gl_Position = ubuf.mvp * vec4(1);\n"
13925 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013926
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013927 char const *fsSource =
13928 "#version 450\n"
13929 "\n"
13930 "layout(location = 0) out vec4 uFragColor;\n"
13931 "void main(){\n"
13932 " uFragColor = vec4(0,1,0,1);\n"
13933 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013934
13935 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13936 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13937
13938 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13939 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13940 pipeline_layout_create_info.setLayoutCount = 1;
13941 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13942
13943 VkPipelineLayout pipeline_layout;
13944 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13945
13946 VkPipelineObj pipe(m_device);
13947 pipe.AddColorAttachment();
13948 pipe.AddShader(&vs);
13949 pipe.AddShader(&fs);
13950
13951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13952 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13953 m_errorMonitor->VerifyFound();
13954
13955 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13956 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13957 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13958}
13959
13960TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13961 TEST_DESCRIPTION(
13962 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13963
Tony Barbour1fa09702017-03-16 12:09:08 -060013964 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013965 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13966
13967 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13968
13969 VkDescriptorPoolSize descriptor_pool_type_count = {};
13970 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13971 descriptor_pool_type_count.descriptorCount = 1;
13972
13973 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13974 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13975 descriptor_pool_create_info.maxSets = 1;
13976 descriptor_pool_create_info.poolSizeCount = 1;
13977 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13978 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13979
13980 VkDescriptorPool descriptorset_pool;
13981 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13982
13983 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13984 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13985 descriptorset_layout_binding.descriptorCount = 1;
13986 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13987 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013988 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013989
13990 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13991 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13992 descriptorset_layout_create_info.bindingCount = 1;
13993 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13994
13995 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013996 ASSERT_VK_SUCCESS(
13997 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013998
13999 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14000 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14001 descriptorset_allocate_info.descriptorSetCount = 1;
14002 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14003 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14004 VkDescriptorSet descriptorset;
14005 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14006
14007 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
14008
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014009 char const *vsSource =
14010 "#version 450\n"
14011 "\n"
14012 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14013 " mat4 mvp;\n"
14014 "} ubuf;\n"
14015 "out gl_PerVertex {\n"
14016 " vec4 gl_Position;\n"
14017 "};\n"
14018 "void main(){\n"
14019 " gl_Position = ubuf.mvp * vec4(1);\n"
14020 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014021
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014022 char const *fsSource =
14023 "#version 450\n"
14024 "\n"
14025 "layout(location = 0) out vec4 uFragColor;\n"
14026 "void main(){\n"
14027 " uFragColor = vec4(0,1,0,1);\n"
14028 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014029
14030 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14031 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14032
14033 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14034 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14035 pipeline_layout_create_info.setLayoutCount = 1;
14036 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14037
14038 VkPipelineLayout pipeline_layout;
14039 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14040
14041 VkPipelineObj pipe(m_device);
14042 pipe.AddColorAttachment();
14043 pipe.AddShader(&vs);
14044 pipe.AddShader(&fs);
14045
14046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14047 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14048 m_errorMonitor->VerifyFound();
14049
14050 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14051 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14052 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14053}
14054
14055TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014056 TEST_DESCRIPTION(
14057 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14058 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014059
Tony Barbour1fa09702017-03-16 12:09:08 -060014060 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014061 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14062
14063 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014064 "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 -060014065
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014066 char const *vsSource =
14067 "#version 450\n"
14068 "\n"
14069 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14070 "out gl_PerVertex {\n"
14071 " vec4 gl_Position;\n"
14072 "};\n"
14073 "void main(){\n"
14074 " gl_Position = vec4(consts.x);\n"
14075 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014076
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014077 char const *fsSource =
14078 "#version 450\n"
14079 "\n"
14080 "layout(location = 0) out vec4 uFragColor;\n"
14081 "void main(){\n"
14082 " uFragColor = vec4(0,1,0,1);\n"
14083 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014084
14085 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14086 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14087
14088 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14089 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14090
14091 // Set up a push constant range
14092 VkPushConstantRange push_constant_ranges = {};
14093 // Set to the wrong stage to challenge core_validation
14094 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14095 push_constant_ranges.size = 4;
14096
14097 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14098 pipeline_layout_create_info.pushConstantRangeCount = 1;
14099
14100 VkPipelineLayout pipeline_layout;
14101 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14102
14103 VkPipelineObj pipe(m_device);
14104 pipe.AddColorAttachment();
14105 pipe.AddShader(&vs);
14106 pipe.AddShader(&fs);
14107
14108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14109 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14110 m_errorMonitor->VerifyFound();
14111
14112 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14113}
14114
14115TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14116 TEST_DESCRIPTION(
14117 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14118
Tony Barbour1fa09702017-03-16 12:09:08 -060014119 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14121
14122 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014123 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014124
14125 // Some awkward steps are required to test with custom device features.
14126 std::vector<const char *> device_extension_names;
14127 auto features = m_device->phy().features();
14128 // Disable support for 64 bit floats
14129 features.shaderFloat64 = false;
14130 // The sacrificial device object
14131 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14132
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014133 char const *vsSource =
14134 "#version 450\n"
14135 "\n"
14136 "out gl_PerVertex {\n"
14137 " vec4 gl_Position;\n"
14138 "};\n"
14139 "void main(){\n"
14140 " gl_Position = vec4(1);\n"
14141 "}\n";
14142 char const *fsSource =
14143 "#version 450\n"
14144 "\n"
14145 "layout(location=0) out vec4 color;\n"
14146 "void main(){\n"
14147 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14148 " color = vec4(green);\n"
14149 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014150
14151 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14152 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14153
14154 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014155
14156 VkPipelineObj pipe(&test_device);
14157 pipe.AddColorAttachment();
14158 pipe.AddShader(&vs);
14159 pipe.AddShader(&fs);
14160
14161 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14162 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14163 VkPipelineLayout pipeline_layout;
14164 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14165
14166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14167 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14168 m_errorMonitor->VerifyFound();
14169
14170 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14171}
14172
Mark Lobodzinski20832822017-03-24 14:49:45 -060014173TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14174 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14175 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014176
Tony Barbour1fa09702017-03-16 12:09:08 -060014177 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014178 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14179
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014180 char const *vsSource =
14181 "#version 450\n"
14182 "\n"
14183 "out gl_PerVertex {\n"
14184 " vec4 gl_Position;\n"
14185 "};\n"
14186 "layout(xfb_buffer = 1) out;"
14187 "void main(){\n"
14188 " gl_Position = vec4(1);\n"
14189 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014190
Mark Lobodzinski20832822017-03-24 14:49:45 -060014191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014192
Mark Lobodzinski20832822017-03-24 14:49:45 -060014193 std::vector<unsigned int> spv;
14194 VkShaderModuleCreateInfo module_create_info;
14195 VkShaderModule shader_module;
14196 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14197 module_create_info.pNext = NULL;
14198 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14199 module_create_info.pCode = spv.data();
14200 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14201 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014202
Mark Lobodzinski20832822017-03-24 14:49:45 -060014203 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014204
Mark Lobodzinski20832822017-03-24 14:49:45 -060014205 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014206}
14207
Karl Schultz6addd812016-02-02 17:17:23 -070014208TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014209 TEST_DESCRIPTION(
14210 "Test that an error is produced for a fragment shader input "
14211 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014212
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014214
Tony Barbour1fa09702017-03-16 12:09:08 -060014215 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014216 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014217
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014218 char const *vsSource =
14219 "#version 450\n"
14220 "\n"
14221 "out gl_PerVertex {\n"
14222 " vec4 gl_Position;\n"
14223 "};\n"
14224 "void main(){\n"
14225 " gl_Position = vec4(1);\n"
14226 "}\n";
14227 char const *fsSource =
14228 "#version 450\n"
14229 "\n"
14230 "layout(location=0) in float x;\n"
14231 "layout(location=0) out vec4 color;\n"
14232 "void main(){\n"
14233 " color = vec4(x);\n"
14234 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014235
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014236 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14237 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014238
14239 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014240 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014241 pipe.AddShader(&vs);
14242 pipe.AddShader(&fs);
14243
Chris Forbes59cb88d2015-05-25 11:13:13 +120014244 VkDescriptorSetObj descriptorSet(m_device);
14245 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014246 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014247
Tony Barbour5781e8f2015-08-04 16:23:11 -060014248 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014249
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014250 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014251}
14252
Karl Schultz6addd812016-02-02 17:17:23 -070014253TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014254 TEST_DESCRIPTION(
14255 "Test that an error is produced for a fragment shader input "
14256 "within an interace block, which is not present in the outputs "
14257 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014259
Tony Barbour1fa09702017-03-16 12:09:08 -060014260 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014261 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14262
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014263 char const *vsSource =
14264 "#version 450\n"
14265 "\n"
14266 "out gl_PerVertex {\n"
14267 " vec4 gl_Position;\n"
14268 "};\n"
14269 "void main(){\n"
14270 " gl_Position = vec4(1);\n"
14271 "}\n";
14272 char const *fsSource =
14273 "#version 450\n"
14274 "\n"
14275 "in block { layout(location=0) float x; } ins;\n"
14276 "layout(location=0) out vec4 color;\n"
14277 "void main(){\n"
14278 " color = vec4(ins.x);\n"
14279 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014280
14281 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14282 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14283
14284 VkPipelineObj pipe(m_device);
14285 pipe.AddColorAttachment();
14286 pipe.AddShader(&vs);
14287 pipe.AddShader(&fs);
14288
14289 VkDescriptorSetObj descriptorSet(m_device);
14290 descriptorSet.AppendDummy();
14291 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14292
14293 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14294
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014295 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014296}
14297
Karl Schultz6addd812016-02-02 17:17:23 -070014298TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014299 TEST_DESCRIPTION(
14300 "Test that an error is produced for mismatched array sizes "
14301 "across the vertex->fragment shader interface");
14302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14303 "Type mismatch on location 0.0: 'ptr to "
14304 "output arr[2] of float32' vs 'ptr to "
14305 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014306
Tony Barbour1fa09702017-03-16 12:09:08 -060014307 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014308 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14309
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014310 char const *vsSource =
14311 "#version 450\n"
14312 "\n"
14313 "layout(location=0) out float x[2];\n"
14314 "out gl_PerVertex {\n"
14315 " vec4 gl_Position;\n"
14316 "};\n"
14317 "void main(){\n"
14318 " x[0] = 0; x[1] = 0;\n"
14319 " gl_Position = vec4(1);\n"
14320 "}\n";
14321 char const *fsSource =
14322 "#version 450\n"
14323 "\n"
14324 "layout(location=0) in float x[1];\n"
14325 "layout(location=0) out vec4 color;\n"
14326 "void main(){\n"
14327 " color = vec4(x[0]);\n"
14328 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014329
14330 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14331 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14332
14333 VkPipelineObj pipe(m_device);
14334 pipe.AddColorAttachment();
14335 pipe.AddShader(&vs);
14336 pipe.AddShader(&fs);
14337
14338 VkDescriptorSetObj descriptorSet(m_device);
14339 descriptorSet.AppendDummy();
14340 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14341
14342 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14343
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014344 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014345}
14346
Karl Schultz6addd812016-02-02 17:17:23 -070014347TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014348 TEST_DESCRIPTION(
14349 "Test that an error is produced for mismatched types across "
14350 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014352
Tony Barbour1fa09702017-03-16 12:09:08 -060014353 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014354 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014355
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014356 char const *vsSource =
14357 "#version 450\n"
14358 "\n"
14359 "layout(location=0) out int x;\n"
14360 "out gl_PerVertex {\n"
14361 " vec4 gl_Position;\n"
14362 "};\n"
14363 "void main(){\n"
14364 " x = 0;\n"
14365 " gl_Position = vec4(1);\n"
14366 "}\n";
14367 char const *fsSource =
14368 "#version 450\n"
14369 "\n"
14370 "layout(location=0) in float x;\n" /* VS writes int */
14371 "layout(location=0) out vec4 color;\n"
14372 "void main(){\n"
14373 " color = vec4(x);\n"
14374 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014375
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014376 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14377 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014378
14379 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014380 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014381 pipe.AddShader(&vs);
14382 pipe.AddShader(&fs);
14383
Chris Forbesb56af562015-05-25 11:13:17 +120014384 VkDescriptorSetObj descriptorSet(m_device);
14385 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014386 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014387
Tony Barbour5781e8f2015-08-04 16:23:11 -060014388 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014389
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014390 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014391}
14392
Karl Schultz6addd812016-02-02 17:17:23 -070014393TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014394 TEST_DESCRIPTION(
14395 "Test that an error is produced for mismatched types across "
14396 "the vertex->fragment shader interface, when the variable is contained within "
14397 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014399
Tony Barbour1fa09702017-03-16 12:09:08 -060014400 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014401 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14402
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014403 char const *vsSource =
14404 "#version 450\n"
14405 "\n"
14406 "out block { layout(location=0) int x; } outs;\n"
14407 "out gl_PerVertex {\n"
14408 " vec4 gl_Position;\n"
14409 "};\n"
14410 "void main(){\n"
14411 " outs.x = 0;\n"
14412 " gl_Position = vec4(1);\n"
14413 "}\n";
14414 char const *fsSource =
14415 "#version 450\n"
14416 "\n"
14417 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14418 "layout(location=0) out vec4 color;\n"
14419 "void main(){\n"
14420 " color = vec4(ins.x);\n"
14421 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014422
14423 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14424 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14425
14426 VkPipelineObj pipe(m_device);
14427 pipe.AddColorAttachment();
14428 pipe.AddShader(&vs);
14429 pipe.AddShader(&fs);
14430
14431 VkDescriptorSetObj descriptorSet(m_device);
14432 descriptorSet.AppendDummy();
14433 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14434
14435 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14436
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014437 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014438}
14439
14440TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014441 TEST_DESCRIPTION(
14442 "Test that an error is produced for location mismatches across "
14443 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14444 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014445 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 +130014446
Tony Barbour1fa09702017-03-16 12:09:08 -060014447 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014448 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14449
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014450 char const *vsSource =
14451 "#version 450\n"
14452 "\n"
14453 "out block { layout(location=1) float x; } outs;\n"
14454 "out gl_PerVertex {\n"
14455 " vec4 gl_Position;\n"
14456 "};\n"
14457 "void main(){\n"
14458 " outs.x = 0;\n"
14459 " gl_Position = vec4(1);\n"
14460 "}\n";
14461 char const *fsSource =
14462 "#version 450\n"
14463 "\n"
14464 "in block { layout(location=0) float x; } ins;\n"
14465 "layout(location=0) out vec4 color;\n"
14466 "void main(){\n"
14467 " color = vec4(ins.x);\n"
14468 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014469
14470 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14471 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14472
14473 VkPipelineObj pipe(m_device);
14474 pipe.AddColorAttachment();
14475 pipe.AddShader(&vs);
14476 pipe.AddShader(&fs);
14477
14478 VkDescriptorSetObj descriptorSet(m_device);
14479 descriptorSet.AppendDummy();
14480 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14481
14482 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14483
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014484 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014485}
14486
14487TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014488 TEST_DESCRIPTION(
14489 "Test that an error is produced for component mismatches across the "
14490 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14491 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014492 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 +130014493
Tony Barbour1fa09702017-03-16 12:09:08 -060014494 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014495 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14496
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014497 char const *vsSource =
14498 "#version 450\n"
14499 "\n"
14500 "out block { layout(location=0, component=0) float x; } outs;\n"
14501 "out gl_PerVertex {\n"
14502 " vec4 gl_Position;\n"
14503 "};\n"
14504 "void main(){\n"
14505 " outs.x = 0;\n"
14506 " gl_Position = vec4(1);\n"
14507 "}\n";
14508 char const *fsSource =
14509 "#version 450\n"
14510 "\n"
14511 "in block { layout(location=0, component=1) float x; } ins;\n"
14512 "layout(location=0) out vec4 color;\n"
14513 "void main(){\n"
14514 " color = vec4(ins.x);\n"
14515 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014516
14517 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14518 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14519
14520 VkPipelineObj pipe(m_device);
14521 pipe.AddColorAttachment();
14522 pipe.AddShader(&vs);
14523 pipe.AddShader(&fs);
14524
14525 VkDescriptorSetObj descriptorSet(m_device);
14526 descriptorSet.AppendDummy();
14527 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14528
14529 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14530
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014531 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014532}
14533
Chris Forbes1f3b0152016-11-30 12:48:40 +130014534TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14535 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14536
Tony Barbour1fa09702017-03-16 12:09:08 -060014537 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014538 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14539
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014540 char const *vsSource =
14541 "#version 450\n"
14542 "layout(location=0) out mediump float x;\n"
14543 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14544 char const *fsSource =
14545 "#version 450\n"
14546 "layout(location=0) in highp float x;\n"
14547 "layout(location=0) out vec4 color;\n"
14548 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014549
14550 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14551 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14552
14553 VkPipelineObj pipe(m_device);
14554 pipe.AddColorAttachment();
14555 pipe.AddShader(&vs);
14556 pipe.AddShader(&fs);
14557
14558 VkDescriptorSetObj descriptorSet(m_device);
14559 descriptorSet.AppendDummy();
14560 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14561
14562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14563
14564 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14565
14566 m_errorMonitor->VerifyFound();
14567}
14568
Chris Forbes870a39e2016-11-30 12:55:56 +130014569TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14570 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14571
Tony Barbour1fa09702017-03-16 12:09:08 -060014572 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14574
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014575 char const *vsSource =
14576 "#version 450\n"
14577 "out block { layout(location=0) mediump float x; };\n"
14578 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14579 char const *fsSource =
14580 "#version 450\n"
14581 "in block { layout(location=0) highp float x; };\n"
14582 "layout(location=0) out vec4 color;\n"
14583 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014584
14585 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14586 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14587
14588 VkPipelineObj pipe(m_device);
14589 pipe.AddColorAttachment();
14590 pipe.AddShader(&vs);
14591 pipe.AddShader(&fs);
14592
14593 VkDescriptorSetObj descriptorSet(m_device);
14594 descriptorSet.AppendDummy();
14595 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14596
14597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14598
14599 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14600
14601 m_errorMonitor->VerifyFound();
14602}
14603
Karl Schultz6addd812016-02-02 17:17:23 -070014604TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014605 TEST_DESCRIPTION(
14606 "Test that a warning is produced for a vertex attribute which is "
14607 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014609
Tony Barbour1fa09702017-03-16 12:09:08 -060014610 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014611 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014612
14613 VkVertexInputBindingDescription input_binding;
14614 memset(&input_binding, 0, sizeof(input_binding));
14615
14616 VkVertexInputAttributeDescription input_attrib;
14617 memset(&input_attrib, 0, sizeof(input_attrib));
14618 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14619
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014620 char const *vsSource =
14621 "#version 450\n"
14622 "\n"
14623 "out gl_PerVertex {\n"
14624 " vec4 gl_Position;\n"
14625 "};\n"
14626 "void main(){\n"
14627 " gl_Position = vec4(1);\n"
14628 "}\n";
14629 char const *fsSource =
14630 "#version 450\n"
14631 "\n"
14632 "layout(location=0) out vec4 color;\n"
14633 "void main(){\n"
14634 " color = vec4(1);\n"
14635 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014636
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014637 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14638 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014639
14640 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014641 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014642 pipe.AddShader(&vs);
14643 pipe.AddShader(&fs);
14644
14645 pipe.AddVertexInputBindings(&input_binding, 1);
14646 pipe.AddVertexInputAttribs(&input_attrib, 1);
14647
Chris Forbesde136e02015-05-25 11:13:28 +120014648 VkDescriptorSetObj descriptorSet(m_device);
14649 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014650 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014651
Tony Barbour5781e8f2015-08-04 16:23:11 -060014652 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014653
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014654 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014655}
14656
Karl Schultz6addd812016-02-02 17:17:23 -070014657TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014658 TEST_DESCRIPTION(
14659 "Test that a warning is produced for a location mismatch on "
14660 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014662
Tony Barbour1fa09702017-03-16 12:09:08 -060014663 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14665
14666 VkVertexInputBindingDescription input_binding;
14667 memset(&input_binding, 0, sizeof(input_binding));
14668
14669 VkVertexInputAttributeDescription input_attrib;
14670 memset(&input_attrib, 0, sizeof(input_attrib));
14671 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14672
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014673 char const *vsSource =
14674 "#version 450\n"
14675 "\n"
14676 "layout(location=1) in float x;\n"
14677 "out gl_PerVertex {\n"
14678 " vec4 gl_Position;\n"
14679 "};\n"
14680 "void main(){\n"
14681 " gl_Position = vec4(x);\n"
14682 "}\n";
14683 char const *fsSource =
14684 "#version 450\n"
14685 "\n"
14686 "layout(location=0) out vec4 color;\n"
14687 "void main(){\n"
14688 " color = vec4(1);\n"
14689 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014690
14691 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14692 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14693
14694 VkPipelineObj pipe(m_device);
14695 pipe.AddColorAttachment();
14696 pipe.AddShader(&vs);
14697 pipe.AddShader(&fs);
14698
14699 pipe.AddVertexInputBindings(&input_binding, 1);
14700 pipe.AddVertexInputAttribs(&input_attrib, 1);
14701
14702 VkDescriptorSetObj descriptorSet(m_device);
14703 descriptorSet.AppendDummy();
14704 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14705
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014706 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014707 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14708
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014709 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014710}
14711
Karl Schultz6addd812016-02-02 17:17:23 -070014712TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014713 TEST_DESCRIPTION(
14714 "Test that an error is produced for a vertex shader input which is not "
14715 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14717 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014718
Tony Barbour1fa09702017-03-16 12:09:08 -060014719 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014720 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014721
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014722 char const *vsSource =
14723 "#version 450\n"
14724 "\n"
14725 "layout(location=0) in vec4 x;\n" /* not provided */
14726 "out gl_PerVertex {\n"
14727 " vec4 gl_Position;\n"
14728 "};\n"
14729 "void main(){\n"
14730 " gl_Position = x;\n"
14731 "}\n";
14732 char const *fsSource =
14733 "#version 450\n"
14734 "\n"
14735 "layout(location=0) out vec4 color;\n"
14736 "void main(){\n"
14737 " color = vec4(1);\n"
14738 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014739
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014740 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14741 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014742
14743 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014744 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014745 pipe.AddShader(&vs);
14746 pipe.AddShader(&fs);
14747
Chris Forbes62e8e502015-05-25 11:13:29 +120014748 VkDescriptorSetObj descriptorSet(m_device);
14749 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014750 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014751
Tony Barbour5781e8f2015-08-04 16:23:11 -060014752 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014753
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014754 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014755}
14756
Karl Schultz6addd812016-02-02 17:17:23 -070014757TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014758 TEST_DESCRIPTION(
14759 "Test that an error is produced for a mismatch between the "
14760 "fundamental type (float/int/uint) of an attribute and the "
14761 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014762 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 -060014763
Tony Barbour1fa09702017-03-16 12:09:08 -060014764 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014765 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014766
14767 VkVertexInputBindingDescription input_binding;
14768 memset(&input_binding, 0, sizeof(input_binding));
14769
14770 VkVertexInputAttributeDescription input_attrib;
14771 memset(&input_attrib, 0, sizeof(input_attrib));
14772 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14773
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014774 char const *vsSource =
14775 "#version 450\n"
14776 "\n"
14777 "layout(location=0) in int x;\n" /* attrib provided float */
14778 "out gl_PerVertex {\n"
14779 " vec4 gl_Position;\n"
14780 "};\n"
14781 "void main(){\n"
14782 " gl_Position = vec4(x);\n"
14783 "}\n";
14784 char const *fsSource =
14785 "#version 450\n"
14786 "\n"
14787 "layout(location=0) out vec4 color;\n"
14788 "void main(){\n"
14789 " color = vec4(1);\n"
14790 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014791
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014792 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14793 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014794
14795 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014796 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014797 pipe.AddShader(&vs);
14798 pipe.AddShader(&fs);
14799
14800 pipe.AddVertexInputBindings(&input_binding, 1);
14801 pipe.AddVertexInputAttribs(&input_attrib, 1);
14802
Chris Forbesc97d98e2015-05-25 11:13:31 +120014803 VkDescriptorSetObj descriptorSet(m_device);
14804 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014805 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014806
Tony Barbour5781e8f2015-08-04 16:23:11 -060014807 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014808
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014809 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014810}
14811
Chris Forbesc68b43c2016-04-06 11:18:47 +120014812TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014813 TEST_DESCRIPTION(
14814 "Test that an error is produced for a pipeline containing multiple "
14815 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14817 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014818
Tony Barbour1fa09702017-03-16 12:09:08 -060014819 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014820 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14821
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014822 char const *vsSource =
14823 "#version 450\n"
14824 "\n"
14825 "out gl_PerVertex {\n"
14826 " vec4 gl_Position;\n"
14827 "};\n"
14828 "void main(){\n"
14829 " gl_Position = vec4(1);\n"
14830 "}\n";
14831 char const *fsSource =
14832 "#version 450\n"
14833 "\n"
14834 "layout(location=0) out vec4 color;\n"
14835 "void main(){\n"
14836 " color = vec4(1);\n"
14837 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014838
14839 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14840 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14841
14842 VkPipelineObj pipe(m_device);
14843 pipe.AddColorAttachment();
14844 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014845 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014846 pipe.AddShader(&fs);
14847
14848 VkDescriptorSetObj descriptorSet(m_device);
14849 descriptorSet.AppendDummy();
14850 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14851
14852 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14853
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014854 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014855}
14856
Chris Forbes82ff92a2016-09-09 10:50:24 +120014857TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014859
Tony Barbour1fa09702017-03-16 12:09:08 -060014860 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014861 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14862
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014863 char const *vsSource =
14864 "#version 450\n"
14865 "out gl_PerVertex {\n"
14866 " vec4 gl_Position;\n"
14867 "};\n"
14868 "void main(){\n"
14869 " gl_Position = vec4(0);\n"
14870 "}\n";
14871 char const *fsSource =
14872 "#version 450\n"
14873 "\n"
14874 "layout(location=0) out vec4 color;\n"
14875 "void main(){\n"
14876 " color = vec4(1);\n"
14877 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014878
14879 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14880 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14881
14882 VkPipelineObj pipe(m_device);
14883 pipe.AddColorAttachment();
14884 pipe.AddShader(&vs);
14885 pipe.AddShader(&fs);
14886
14887 VkDescriptorSetObj descriptorSet(m_device);
14888 descriptorSet.AppendDummy();
14889 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14890
14891 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14892
14893 m_errorMonitor->VerifyFound();
14894}
14895
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014896TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14898 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14899 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014900
Tony Barbour1fa09702017-03-16 12:09:08 -060014901 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014902 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14903
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014904 char const *vsSource =
14905 "#version 450\n"
14906 "void main(){ gl_Position = vec4(0); }\n";
14907 char const *fsSource =
14908 "#version 450\n"
14909 "\n"
14910 "layout(location=0) out vec4 color;\n"
14911 "void main(){\n"
14912 " color = vec4(1);\n"
14913 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014914
14915 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14916 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14917
14918 VkPipelineObj pipe(m_device);
14919 pipe.AddColorAttachment();
14920 pipe.AddShader(&vs);
14921 pipe.AddShader(&fs);
14922
14923 VkDescriptorSetObj descriptorSet(m_device);
14924 descriptorSet.AppendDummy();
14925 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14926
14927 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014928 {
14929 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14930 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14931 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014932 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014933 {
14934 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14935 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14936 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014937 },
14938 };
14939 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014940 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014941 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014942 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14943 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014944 VkRenderPass rp;
14945 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14946 ASSERT_VK_SUCCESS(err);
14947
14948 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14949
14950 m_errorMonitor->VerifyFound();
14951
14952 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14953}
14954
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014955TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014956 TEST_DESCRIPTION(
14957 "Test that an error is produced for a variable output from "
14958 "the TCS without the patch decoration, but consumed in the TES "
14959 "with the decoration.");
14960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14961 "is per-vertex in tessellation control shader stage "
14962 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014963
Tony Barbour1fa09702017-03-16 12:09:08 -060014964 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014965 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14966
Chris Forbesc1e852d2016-04-04 19:26:42 +120014967 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014968 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014969 return;
14970 }
14971
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014972 char const *vsSource =
14973 "#version 450\n"
14974 "void main(){}\n";
14975 char const *tcsSource =
14976 "#version 450\n"
14977 "layout(location=0) out int x[];\n"
14978 "layout(vertices=3) out;\n"
14979 "void main(){\n"
14980 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14981 " gl_TessLevelInner[0] = 1;\n"
14982 " x[gl_InvocationID] = gl_InvocationID;\n"
14983 "}\n";
14984 char const *tesSource =
14985 "#version 450\n"
14986 "layout(triangles, equal_spacing, cw) in;\n"
14987 "layout(location=0) patch in int x;\n"
14988 "out gl_PerVertex { vec4 gl_Position; };\n"
14989 "void main(){\n"
14990 " gl_Position.xyz = gl_TessCoord;\n"
14991 " gl_Position.w = x;\n"
14992 "}\n";
14993 char const *fsSource =
14994 "#version 450\n"
14995 "layout(location=0) out vec4 color;\n"
14996 "void main(){\n"
14997 " color = vec4(1);\n"
14998 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014999
15000 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15001 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15002 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15003 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15004
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015005 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15006 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015007
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015008 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015009
15010 VkPipelineObj pipe(m_device);
15011 pipe.SetInputAssembly(&iasci);
15012 pipe.SetTessellation(&tsci);
15013 pipe.AddColorAttachment();
15014 pipe.AddShader(&vs);
15015 pipe.AddShader(&tcs);
15016 pipe.AddShader(&tes);
15017 pipe.AddShader(&fs);
15018
15019 VkDescriptorSetObj descriptorSet(m_device);
15020 descriptorSet.AppendDummy();
15021 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15022
15023 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15024
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015025 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015026}
15027
Karl Schultz6addd812016-02-02 17:17:23 -070015028TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015029 TEST_DESCRIPTION(
15030 "Test that an error is produced for a vertex attribute setup where multiple "
15031 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15033 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015034
Tony Barbour1fa09702017-03-16 12:09:08 -060015035 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015037
15038 /* Two binding descriptions for binding 0 */
15039 VkVertexInputBindingDescription input_bindings[2];
15040 memset(input_bindings, 0, sizeof(input_bindings));
15041
15042 VkVertexInputAttributeDescription input_attrib;
15043 memset(&input_attrib, 0, sizeof(input_attrib));
15044 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15045
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015046 char const *vsSource =
15047 "#version 450\n"
15048 "\n"
15049 "layout(location=0) in float x;\n" /* attrib provided float */
15050 "out gl_PerVertex {\n"
15051 " vec4 gl_Position;\n"
15052 "};\n"
15053 "void main(){\n"
15054 " gl_Position = vec4(x);\n"
15055 "}\n";
15056 char const *fsSource =
15057 "#version 450\n"
15058 "\n"
15059 "layout(location=0) out vec4 color;\n"
15060 "void main(){\n"
15061 " color = vec4(1);\n"
15062 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015063
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015064 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15065 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015066
15067 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015068 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015069 pipe.AddShader(&vs);
15070 pipe.AddShader(&fs);
15071
15072 pipe.AddVertexInputBindings(input_bindings, 2);
15073 pipe.AddVertexInputAttribs(&input_attrib, 1);
15074
Chris Forbes280ba2c2015-06-12 11:16:41 +120015075 VkDescriptorSetObj descriptorSet(m_device);
15076 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015077 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015078
Tony Barbour5781e8f2015-08-04 16:23:11 -060015079 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015080
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015081 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015082}
Chris Forbes8f68b562015-05-25 11:13:32 +120015083
Karl Schultz6addd812016-02-02 17:17:23 -070015084TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015085 TEST_DESCRIPTION(
15086 "Test that an error is produced for a fragment shader which does not "
15087 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015089
Tony Barbour1fa09702017-03-16 12:09:08 -060015090 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015091
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015092 char const *vsSource =
15093 "#version 450\n"
15094 "\n"
15095 "out gl_PerVertex {\n"
15096 " vec4 gl_Position;\n"
15097 "};\n"
15098 "void main(){\n"
15099 " gl_Position = vec4(1);\n"
15100 "}\n";
15101 char const *fsSource =
15102 "#version 450\n"
15103 "\n"
15104 "void main(){\n"
15105 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015106
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015107 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15108 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015109
15110 VkPipelineObj pipe(m_device);
15111 pipe.AddShader(&vs);
15112 pipe.AddShader(&fs);
15113
Chia-I Wu08accc62015-07-07 11:50:03 +080015114 /* set up CB 0, not written */
15115 pipe.AddColorAttachment();
15116 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015117
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015118 VkDescriptorSetObj descriptorSet(m_device);
15119 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015120 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015121
Tony Barbour5781e8f2015-08-04 16:23:11 -060015122 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015123
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015124 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015125}
15126
Karl Schultz6addd812016-02-02 17:17:23 -070015127TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015128 TEST_DESCRIPTION(
15129 "Test that a warning is produced for a fragment shader which provides a spurious "
15130 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015132 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015133
Tony Barbour1fa09702017-03-16 12:09:08 -060015134 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015135
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015136 char const *vsSource =
15137 "#version 450\n"
15138 "\n"
15139 "out gl_PerVertex {\n"
15140 " vec4 gl_Position;\n"
15141 "};\n"
15142 "void main(){\n"
15143 " gl_Position = vec4(1);\n"
15144 "}\n";
15145 char const *fsSource =
15146 "#version 450\n"
15147 "\n"
15148 "layout(location=0) out vec4 x;\n"
15149 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15150 "void main(){\n"
15151 " x = vec4(1);\n"
15152 " y = vec4(1);\n"
15153 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015154
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015155 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15156 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015157
15158 VkPipelineObj pipe(m_device);
15159 pipe.AddShader(&vs);
15160 pipe.AddShader(&fs);
15161
Chia-I Wu08accc62015-07-07 11:50:03 +080015162 /* set up CB 0, not written */
15163 pipe.AddColorAttachment();
15164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015165 /* FS writes CB 1, but we don't configure it */
15166
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015167 VkDescriptorSetObj descriptorSet(m_device);
15168 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015169 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015170
Tony Barbour5781e8f2015-08-04 16:23:11 -060015171 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015172
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015173 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015174}
15175
Karl Schultz6addd812016-02-02 17:17:23 -070015176TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015177 TEST_DESCRIPTION(
15178 "Test that an error is produced for a mismatch between the fundamental "
15179 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015181
Tony Barbour1fa09702017-03-16 12:09:08 -060015182 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015183
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015184 char const *vsSource =
15185 "#version 450\n"
15186 "\n"
15187 "out gl_PerVertex {\n"
15188 " vec4 gl_Position;\n"
15189 "};\n"
15190 "void main(){\n"
15191 " gl_Position = vec4(1);\n"
15192 "}\n";
15193 char const *fsSource =
15194 "#version 450\n"
15195 "\n"
15196 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15197 "void main(){\n"
15198 " x = ivec4(1);\n"
15199 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015200
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015201 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15202 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015203
15204 VkPipelineObj pipe(m_device);
15205 pipe.AddShader(&vs);
15206 pipe.AddShader(&fs);
15207
Chia-I Wu08accc62015-07-07 11:50:03 +080015208 /* set up CB 0; type is UNORM by default */
15209 pipe.AddColorAttachment();
15210 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015211
Chris Forbesa36d69e2015-05-25 11:13:44 +120015212 VkDescriptorSetObj descriptorSet(m_device);
15213 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015214 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015215
Tony Barbour5781e8f2015-08-04 16:23:11 -060015216 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015217
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015218 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015219}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015220
Karl Schultz6addd812016-02-02 17:17:23 -070015221TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015222 TEST_DESCRIPTION(
15223 "Test that an error is produced for a shader consuming a uniform "
15224 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015226
Tony Barbour1fa09702017-03-16 12:09:08 -060015227 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015228
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015229 char const *vsSource =
15230 "#version 450\n"
15231 "\n"
15232 "out gl_PerVertex {\n"
15233 " vec4 gl_Position;\n"
15234 "};\n"
15235 "void main(){\n"
15236 " gl_Position = vec4(1);\n"
15237 "}\n";
15238 char const *fsSource =
15239 "#version 450\n"
15240 "\n"
15241 "layout(location=0) out vec4 x;\n"
15242 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15243 "void main(){\n"
15244 " x = vec4(bar.y);\n"
15245 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015246
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015247 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15248 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015249
Chris Forbes556c76c2015-08-14 12:04:59 +120015250 VkPipelineObj pipe(m_device);
15251 pipe.AddShader(&vs);
15252 pipe.AddShader(&fs);
15253
15254 /* set up CB 0; type is UNORM by default */
15255 pipe.AddColorAttachment();
15256 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15257
15258 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015259 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015260
15261 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15262
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015263 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015264}
15265
Chris Forbes5c59e902016-02-26 16:56:09 +130015266TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015267 TEST_DESCRIPTION(
15268 "Test that an error is produced for a shader consuming push constants "
15269 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015271
Tony Barbour1fa09702017-03-16 12:09:08 -060015272 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015273
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015274 char const *vsSource =
15275 "#version 450\n"
15276 "\n"
15277 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15278 "out gl_PerVertex {\n"
15279 " vec4 gl_Position;\n"
15280 "};\n"
15281 "void main(){\n"
15282 " gl_Position = vec4(consts.x);\n"
15283 "}\n";
15284 char const *fsSource =
15285 "#version 450\n"
15286 "\n"
15287 "layout(location=0) out vec4 x;\n"
15288 "void main(){\n"
15289 " x = vec4(1);\n"
15290 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015291
15292 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15293 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15294
15295 VkPipelineObj pipe(m_device);
15296 pipe.AddShader(&vs);
15297 pipe.AddShader(&fs);
15298
15299 /* set up CB 0; type is UNORM by default */
15300 pipe.AddColorAttachment();
15301 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15302
15303 VkDescriptorSetObj descriptorSet(m_device);
15304 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15305
15306 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15307
15308 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015309 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015310}
15311
Chris Forbes3fb17902016-08-22 14:57:55 +120015312TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015313 TEST_DESCRIPTION(
15314 "Test that an error is produced for a shader consuming an input attachment "
15315 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15317 "consumes input attachment index 0 but not provided in subpass");
15318
Tony Barbour1fa09702017-03-16 12:09:08 -060015319 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015320
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015321 char const *vsSource =
15322 "#version 450\n"
15323 "\n"
15324 "out gl_PerVertex {\n"
15325 " vec4 gl_Position;\n"
15326 "};\n"
15327 "void main(){\n"
15328 " gl_Position = vec4(1);\n"
15329 "}\n";
15330 char const *fsSource =
15331 "#version 450\n"
15332 "\n"
15333 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15334 "layout(location=0) out vec4 color;\n"
15335 "void main() {\n"
15336 " color = subpassLoad(x);\n"
15337 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015338
15339 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15340 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15341
15342 VkPipelineObj pipe(m_device);
15343 pipe.AddShader(&vs);
15344 pipe.AddShader(&fs);
15345 pipe.AddColorAttachment();
15346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15347
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015348 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15349 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015350 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015351 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015352 ASSERT_VK_SUCCESS(err);
15353
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015354 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015355 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015356 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015357 ASSERT_VK_SUCCESS(err);
15358
15359 // error here.
15360 pipe.CreateVKPipeline(pl, renderPass());
15361
15362 m_errorMonitor->VerifyFound();
15363
15364 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15365 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15366}
15367
Chris Forbes5a9a0472016-08-22 16:02:09 +120015368TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015369 TEST_DESCRIPTION(
15370 "Test that an error is produced for a shader consuming an input attachment "
15371 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15373 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15374
Tony Barbour1fa09702017-03-16 12:09:08 -060015375 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015376
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015377 char const *vsSource =
15378 "#version 450\n"
15379 "\n"
15380 "out gl_PerVertex {\n"
15381 " vec4 gl_Position;\n"
15382 "};\n"
15383 "void main(){\n"
15384 " gl_Position = vec4(1);\n"
15385 "}\n";
15386 char const *fsSource =
15387 "#version 450\n"
15388 "\n"
15389 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15390 "layout(location=0) out vec4 color;\n"
15391 "void main() {\n"
15392 " color = subpassLoad(x);\n"
15393 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015394
15395 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15396 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15397
15398 VkPipelineObj pipe(m_device);
15399 pipe.AddShader(&vs);
15400 pipe.AddShader(&fs);
15401 pipe.AddColorAttachment();
15402 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15403
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015404 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15405 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015406 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015407 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015408 ASSERT_VK_SUCCESS(err);
15409
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015410 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015411 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015412 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015413 ASSERT_VK_SUCCESS(err);
15414
15415 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015416 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15417 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15418 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15419 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15420 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 +120015421 };
15422 VkAttachmentReference color = {
15423 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15424 };
15425 VkAttachmentReference input = {
15426 1, VK_IMAGE_LAYOUT_GENERAL,
15427 };
15428
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015429 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015430
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015431 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015432 VkRenderPass rp;
15433 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15434 ASSERT_VK_SUCCESS(err);
15435
15436 // error here.
15437 pipe.CreateVKPipeline(pl, rp);
15438
15439 m_errorMonitor->VerifyFound();
15440
15441 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15442 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15443 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15444}
15445
Chris Forbes541f7b02016-08-22 15:30:27 +120015446TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015447 TEST_DESCRIPTION(
15448 "Test that an error is produced for a shader consuming an input attachment "
15449 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015451 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015452
Tony Barbour1fa09702017-03-16 12:09:08 -060015453 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015454
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015455 char const *vsSource =
15456 "#version 450\n"
15457 "\n"
15458 "out gl_PerVertex {\n"
15459 " vec4 gl_Position;\n"
15460 "};\n"
15461 "void main(){\n"
15462 " gl_Position = vec4(1);\n"
15463 "}\n";
15464 char const *fsSource =
15465 "#version 450\n"
15466 "\n"
15467 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15468 "layout(location=0) out vec4 color;\n"
15469 "void main() {\n"
15470 " color = subpassLoad(xs[0]);\n"
15471 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015472
15473 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15474 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15475
15476 VkPipelineObj pipe(m_device);
15477 pipe.AddShader(&vs);
15478 pipe.AddShader(&fs);
15479 pipe.AddColorAttachment();
15480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15481
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015482 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15483 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015484 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015485 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015486 ASSERT_VK_SUCCESS(err);
15487
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015488 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015489 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015490 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015491 ASSERT_VK_SUCCESS(err);
15492
15493 // error here.
15494 pipe.CreateVKPipeline(pl, renderPass());
15495
15496 m_errorMonitor->VerifyFound();
15497
15498 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15499 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15500}
15501
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015502TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015503 TEST_DESCRIPTION(
15504 "Test that an error is produced for a compute pipeline consuming a "
15505 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015506 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015507
Tony Barbour1fa09702017-03-16 12:09:08 -060015508 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015509
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015510 char const *csSource =
15511 "#version 450\n"
15512 "\n"
15513 "layout(local_size_x=1) in;\n"
15514 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15515 "void main(){\n"
15516 " x = vec4(1);\n"
15517 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015518
15519 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15520
15521 VkDescriptorSetObj descriptorSet(m_device);
15522 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15523
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015524 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15525 nullptr,
15526 0,
15527 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15528 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15529 descriptorSet.GetPipelineLayout(),
15530 VK_NULL_HANDLE,
15531 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015532
15533 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015534 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015535
15536 m_errorMonitor->VerifyFound();
15537
15538 if (err == VK_SUCCESS) {
15539 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15540 }
15541}
15542
Chris Forbes22a9b092016-07-19 14:34:05 +120015543TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015544 TEST_DESCRIPTION(
15545 "Test that an error is produced for a pipeline consuming a "
15546 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15548 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015549
Tony Barbour1fa09702017-03-16 12:09:08 -060015550 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015551
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015552 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15553 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015554 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015555 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015556 ASSERT_VK_SUCCESS(err);
15557
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015558 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015559 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015560 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015561 ASSERT_VK_SUCCESS(err);
15562
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015563 char const *csSource =
15564 "#version 450\n"
15565 "\n"
15566 "layout(local_size_x=1) in;\n"
15567 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15568 "void main() {\n"
15569 " x.x = 1.0f;\n"
15570 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015571 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15572
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015573 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15574 nullptr,
15575 0,
15576 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15577 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15578 pl,
15579 VK_NULL_HANDLE,
15580 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015581
15582 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015583 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015584
15585 m_errorMonitor->VerifyFound();
15586
15587 if (err == VK_SUCCESS) {
15588 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15589 }
15590
15591 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15592 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15593}
15594
Chris Forbes50020592016-07-27 13:52:41 +120015595TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015596 TEST_DESCRIPTION(
15597 "Test that an error is produced when an image view type "
15598 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015599
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015600 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 +120015601
Tony Barbour1fa09702017-03-16 12:09:08 -060015602 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015603 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15604
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015605 char const *vsSource =
15606 "#version 450\n"
15607 "\n"
15608 "out gl_PerVertex { vec4 gl_Position; };\n"
15609 "void main() { gl_Position = vec4(0); }\n";
15610 char const *fsSource =
15611 "#version 450\n"
15612 "\n"
15613 "layout(set=0, binding=0) uniform sampler3D s;\n"
15614 "layout(location=0) out vec4 color;\n"
15615 "void main() {\n"
15616 " color = texture(s, vec3(0));\n"
15617 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015618 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15619 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15620
15621 VkPipelineObj pipe(m_device);
15622 pipe.AddShader(&vs);
15623 pipe.AddShader(&fs);
15624 pipe.AddColorAttachment();
15625
15626 VkTextureObj texture(m_device, nullptr);
15627 VkSamplerObj sampler(m_device);
15628
15629 VkDescriptorSetObj descriptorSet(m_device);
15630 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15631 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15632
15633 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15634 ASSERT_VK_SUCCESS(err);
15635
Tony Barbour552f6c02016-12-21 14:34:07 -070015636 m_commandBuffer->BeginCommandBuffer();
15637 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015638
15639 m_commandBuffer->BindPipeline(pipe);
15640 m_commandBuffer->BindDescriptorSet(descriptorSet);
15641
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015642 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015643 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015644 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015645 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15646
15647 // error produced here.
15648 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15649
15650 m_errorMonitor->VerifyFound();
15651
Tony Barbour552f6c02016-12-21 14:34:07 -070015652 m_commandBuffer->EndRenderPass();
15653 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015654}
15655
Chris Forbes5533bfc2016-07-27 14:12:34 +120015656TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015657 TEST_DESCRIPTION(
15658 "Test that an error is produced when a multisampled images "
15659 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015660
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015662
Tony Barbour1fa09702017-03-16 12:09:08 -060015663 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15665
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015666 char const *vsSource =
15667 "#version 450\n"
15668 "\n"
15669 "out gl_PerVertex { vec4 gl_Position; };\n"
15670 "void main() { gl_Position = vec4(0); }\n";
15671 char const *fsSource =
15672 "#version 450\n"
15673 "\n"
15674 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15675 "layout(location=0) out vec4 color;\n"
15676 "void main() {\n"
15677 " color = texelFetch(s, ivec2(0), 0);\n"
15678 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015679 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15680 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15681
15682 VkPipelineObj pipe(m_device);
15683 pipe.AddShader(&vs);
15684 pipe.AddShader(&fs);
15685 pipe.AddColorAttachment();
15686
15687 VkTextureObj texture(m_device, nullptr);
15688 VkSamplerObj sampler(m_device);
15689
15690 VkDescriptorSetObj descriptorSet(m_device);
15691 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15692 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15693
15694 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15695 ASSERT_VK_SUCCESS(err);
15696
Tony Barbour552f6c02016-12-21 14:34:07 -070015697 m_commandBuffer->BeginCommandBuffer();
15698 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015699
15700 m_commandBuffer->BindPipeline(pipe);
15701 m_commandBuffer->BindDescriptorSet(descriptorSet);
15702
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015703 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015704 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015705 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015706 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15707
15708 // error produced here.
15709 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15710
15711 m_errorMonitor->VerifyFound();
15712
Tony Barbour552f6c02016-12-21 14:34:07 -070015713 m_commandBuffer->EndRenderPass();
15714 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015715}
15716
Mark Youngc48c4c12016-04-11 14:26:49 -060015717TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015718 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015719
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015720 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15721 {
15722 VkFormatProperties properties;
15723 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15724 if (properties.optimalTilingFeatures == 0) {
15725 printf(" Image format not supported; skipped.\n");
15726 return;
15727 }
15728 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015729
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015730 VkImageCreateInfo info = {};
15731 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15732 info.pNext = NULL;
15733 info.imageType = VK_IMAGE_TYPE_2D;
15734 info.format = format;
15735 info.extent.height = 32;
15736 info.extent.depth = 1;
15737 info.mipLevels = 1;
15738 info.arrayLayers = 1;
15739 info.samples = VK_SAMPLE_COUNT_1_BIT;
15740 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15741 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15742 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015743
15744 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015745 {
15746 VkImageFormatProperties properties;
15747 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15748 info.tiling, info.usage, info.flags, &properties);
15749 ASSERT_VK_SUCCESS(result);
15750 info.extent.width = properties.maxExtent.width + 1;
15751 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015752
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015753 VkImage image;
15754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15755 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015756 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015757}
15758
Mark Youngc48c4c12016-04-11 14:26:49 -060015759TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015760 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015761
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015762 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15763 {
15764 VkFormatProperties properties;
15765 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15766 if (properties.optimalTilingFeatures == 0) {
15767 printf(" Image format not supported; skipped.\n");
15768 return;
15769 }
15770 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015771
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015772 VkImageCreateInfo info = {};
15773 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15774 info.pNext = NULL;
15775 info.imageType = VK_IMAGE_TYPE_2D;
15776 info.format = format;
15777 info.extent.height = 32;
15778 info.extent.depth = 1;
15779 info.mipLevels = 1;
15780 info.arrayLayers = 1;
15781 info.samples = VK_SAMPLE_COUNT_1_BIT;
15782 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15783 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15784 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015785
15786 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015787 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015788
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015789 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060015790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015791 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15792 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015793 m_errorMonitor->VerifyFound();
15794}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015795
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015796TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015797 TEST_DESCRIPTION(
15798 "Create a render pass with an attachment description "
15799 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015800
Tony Barbour1fa09702017-03-16 12:09:08 -060015801 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015802 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15803
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015805
15806 VkAttachmentReference color_attach = {};
15807 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15808 color_attach.attachment = 0;
15809 VkSubpassDescription subpass = {};
15810 subpass.colorAttachmentCount = 1;
15811 subpass.pColorAttachments = &color_attach;
15812
15813 VkRenderPassCreateInfo rpci = {};
15814 rpci.subpassCount = 1;
15815 rpci.pSubpasses = &subpass;
15816 rpci.attachmentCount = 1;
15817 VkAttachmentDescription attach_desc = {};
15818 attach_desc.format = VK_FORMAT_UNDEFINED;
15819 rpci.pAttachments = &attach_desc;
15820 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15821 VkRenderPass rp;
15822 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15823
15824 m_errorMonitor->VerifyFound();
15825
15826 if (result == VK_SUCCESS) {
15827 vkDestroyRenderPass(m_device->device(), rp, NULL);
15828 }
15829}
15830
Karl Schultz6addd812016-02-02 17:17:23 -070015831TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015832 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015833
Mike Stroyana3082432015-09-25 13:39:21 -060015834 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015835 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15836 const int32_t tex_width = 32;
15837 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015838
15839 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015840 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15841 image_create_info.pNext = NULL;
15842 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15843 image_create_info.format = tex_format;
15844 image_create_info.extent.width = tex_width;
15845 image_create_info.extent.height = tex_height;
15846 image_create_info.extent.depth = 1;
15847 image_create_info.mipLevels = 1;
15848 image_create_info.arrayLayers = 1;
15849 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15850 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15851 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15852 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015853
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015854 VkImage image;
15855 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015856 ASSERT_VK_SUCCESS(err);
15857
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015858 VkMemoryRequirements requirements;
15859 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15860
15861 VkMemoryAllocateInfo alloc_info{};
15862 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15863 alloc_info.pNext = NULL;
15864 alloc_info.memoryTypeIndex = 0;
15865 alloc_info.allocationSize = requirements.size;
15866 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15867 ASSERT_TRUE(pass);
15868
15869 VkDeviceMemory memory;
15870 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15871 ASSERT_VK_SUCCESS(err);
15872
15873 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15874
Tobin Ehliscde08892015-09-22 10:11:37 -060015875 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015876 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015877 image_view_create_info.image = image;
15878 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15879 image_view_create_info.format = tex_format;
15880 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015881 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015882 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015883 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015884
15885 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015887 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015888 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015889
15890 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015891 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015892}
Mike Stroyana3082432015-09-25 13:39:21 -060015893
Mark Youngd339ba32016-05-30 13:28:35 -060015894TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15895 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015897 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015898
Tony Barbour1fa09702017-03-16 12:09:08 -060015899 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015900
15901 // Create an image and try to create a view with no memory backing the image
15902 VkImage image;
15903
15904 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15905 const int32_t tex_width = 32;
15906 const int32_t tex_height = 32;
15907
15908 VkImageCreateInfo image_create_info = {};
15909 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15910 image_create_info.pNext = NULL;
15911 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15912 image_create_info.format = tex_format;
15913 image_create_info.extent.width = tex_width;
15914 image_create_info.extent.height = tex_height;
15915 image_create_info.extent.depth = 1;
15916 image_create_info.mipLevels = 1;
15917 image_create_info.arrayLayers = 1;
15918 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15919 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15920 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15921 image_create_info.flags = 0;
15922
15923 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15924 ASSERT_VK_SUCCESS(err);
15925
15926 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015927 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015928 image_view_create_info.image = image;
15929 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15930 image_view_create_info.format = tex_format;
15931 image_view_create_info.subresourceRange.layerCount = 1;
15932 image_view_create_info.subresourceRange.baseMipLevel = 0;
15933 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015934 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015935
15936 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015937 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015938
15939 m_errorMonitor->VerifyFound();
15940 vkDestroyImage(m_device->device(), image, NULL);
15941 // If last error is success, it still created the view, so delete it.
15942 if (err == VK_SUCCESS) {
15943 vkDestroyImageView(m_device->device(), view, NULL);
15944 }
Mark Youngd339ba32016-05-30 13:28:35 -060015945}
15946
Karl Schultz6addd812016-02-02 17:17:23 -070015947TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015948 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015950
Tony Barbour1fa09702017-03-16 12:09:08 -060015951 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015952
Karl Schultz6addd812016-02-02 17:17:23 -070015953 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015954 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015955 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015956 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015957
15958 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015959 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015960 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015961 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15962 image_view_create_info.format = tex_format;
15963 image_view_create_info.subresourceRange.baseMipLevel = 0;
15964 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015965 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015966 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015967 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015968
15969 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015970 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015971
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015972 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015973}
15974
Mike Weiblena1e13f42017-02-09 21:25:59 -070015975TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15976 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15977
Tony Barbour1fa09702017-03-16 12:09:08 -060015978 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015979 VkSubresourceLayout subres_layout = {};
15980
15981 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15982 {
15983 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15984 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015985 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015986 ASSERT_TRUE(img.initialized());
15987
15988 VkImageSubresource subres = {};
15989 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15990 subres.mipLevel = 0;
15991 subres.arrayLayer = 0;
15992
15993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15994 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15995 m_errorMonitor->VerifyFound();
15996 }
15997
15998 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15999 {
16000 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016001 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016002 ASSERT_TRUE(img.initialized());
16003
16004 VkImageSubresource subres = {};
16005 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
16006 subres.mipLevel = 0;
16007 subres.arrayLayer = 0;
16008
16009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16011 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16012 m_errorMonitor->VerifyFound();
16013 }
16014
16015 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16016 {
16017 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016018 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016019 ASSERT_TRUE(img.initialized());
16020
16021 VkImageSubresource subres = {};
16022 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16023 subres.mipLevel = 1; // ERROR: triggers VU 00739
16024 subres.arrayLayer = 0;
16025
16026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16027 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16028 m_errorMonitor->VerifyFound();
16029 }
16030
16031 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16032 {
16033 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016034 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016035 ASSERT_TRUE(img.initialized());
16036
16037 VkImageSubresource subres = {};
16038 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16039 subres.mipLevel = 0;
16040 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16041
16042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16043 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16044 m_errorMonitor->VerifyFound();
16045 }
16046}
16047
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016048TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016049 VkResult err;
16050 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016051
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016053
Tony Barbour1fa09702017-03-16 12:09:08 -060016054 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016055
16056 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016057 VkImage srcImage;
16058 VkImage dstImage;
16059 VkDeviceMemory srcMem;
16060 VkDeviceMemory destMem;
16061 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016062
16063 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016064 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16065 image_create_info.pNext = NULL;
16066 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16067 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16068 image_create_info.extent.width = 32;
16069 image_create_info.extent.height = 32;
16070 image_create_info.extent.depth = 1;
16071 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016072 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016073 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16074 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16075 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16076 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016077
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016078 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016079 ASSERT_VK_SUCCESS(err);
16080
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016081 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016082 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016083 ASSERT_VK_SUCCESS(err);
16084
16085 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016086 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016087 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16088 memAlloc.pNext = NULL;
16089 memAlloc.allocationSize = 0;
16090 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016091
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016092 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016093 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016094 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016095 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016096 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016097 ASSERT_VK_SUCCESS(err);
16098
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016099 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016100 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016101 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016102 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016103 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016104 ASSERT_VK_SUCCESS(err);
16105
16106 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16107 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016108 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016109 ASSERT_VK_SUCCESS(err);
16110
Tony Barbour552f6c02016-12-21 14:34:07 -070016111 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016112 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016113 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016114 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016115 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016116 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016117 copyRegion.srcOffset.x = 0;
16118 copyRegion.srcOffset.y = 0;
16119 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016120 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016121 copyRegion.dstSubresource.mipLevel = 0;
16122 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016123 // Introduce failure by forcing the dst layerCount to differ from src
16124 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016125 copyRegion.dstOffset.x = 0;
16126 copyRegion.dstOffset.y = 0;
16127 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016128 copyRegion.extent.width = 1;
16129 copyRegion.extent.height = 1;
16130 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016131 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016132 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016133
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016134 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016135
Chia-I Wuf7458c52015-10-26 21:10:41 +080016136 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016137 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016138 vkFreeMemory(m_device->device(), srcMem, NULL);
16139 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016140}
16141
Tony Barbourd6673642016-05-05 14:46:39 -060016142TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016143 TEST_DESCRIPTION("Creating images with unsuported formats ");
16144
Tony Barbour1fa09702017-03-16 12:09:08 -060016145 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016147
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016148 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016149 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016150 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016151 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16152 image_create_info.format = VK_FORMAT_UNDEFINED;
16153 image_create_info.extent.width = 32;
16154 image_create_info.extent.height = 32;
16155 image_create_info.extent.depth = 1;
16156 image_create_info.mipLevels = 1;
16157 image_create_info.arrayLayers = 1;
16158 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16159 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16160 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016161
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16163 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016164
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016165 VkImage image;
16166 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016167 m_errorMonitor->VerifyFound();
16168
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016169 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016170 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016171 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16172 VkFormat format = static_cast<VkFormat>(f);
16173 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016174 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016175 unsupported = format;
16176 break;
16177 }
16178 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016179
Tony Barbourd6673642016-05-05 14:46:39 -060016180 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016181 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016183
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016184 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016185 m_errorMonitor->VerifyFound();
16186 }
16187}
16188
16189TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016190 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16191
Tony Barbour1fa09702017-03-16 12:09:08 -060016192 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016193 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016194 if (!depth_format) {
16195 return;
16196 }
Tony Barbourd6673642016-05-05 14:46:39 -060016197
16198 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016199 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 -060016200 VK_IMAGE_TILING_OPTIMAL, 0);
16201 ASSERT_TRUE(image.initialized());
16202
16203 VkImageView imgView;
16204 VkImageViewCreateInfo imgViewInfo = {};
16205 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16206 imgViewInfo.image = image.handle();
16207 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16208 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16209 imgViewInfo.subresourceRange.layerCount = 1;
16210 imgViewInfo.subresourceRange.baseMipLevel = 0;
16211 imgViewInfo.subresourceRange.levelCount = 1;
16212 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16213
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016214 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016215 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016217 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16218 m_errorMonitor->VerifyFound();
16219 imgViewInfo.subresourceRange.baseMipLevel = 0;
16220
Tony Barbourd6673642016-05-05 14:46:39 -060016221 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16222 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016224 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16225 m_errorMonitor->VerifyFound();
16226 imgViewInfo.subresourceRange.levelCount = 1;
16227
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016228 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16229 imgViewInfo.subresourceRange.levelCount = 2;
16230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16231 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16232 m_errorMonitor->VerifyFound();
16233 imgViewInfo.subresourceRange.levelCount = 1;
16234
16235 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16236 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16238 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16239 m_errorMonitor->VerifyFound();
16240 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16241
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016242 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16243 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016244 m_errorMonitor->SetDesiredFailureMsg(
16245 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16246 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016247 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16248 m_errorMonitor->VerifyFound();
16249 imgViewInfo.subresourceRange.layerCount = 1;
16250
Tony Barbourd6673642016-05-05 14:46:39 -060016251 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016252 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016253 m_errorMonitor->SetDesiredFailureMsg(
16254 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16255 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016256 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16257 m_errorMonitor->VerifyFound();
16258 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16259
Tony Barbourd6673642016-05-05 14:46:39 -060016260 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16261 // VIEW_CREATE_ERROR
16262 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016264 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16265 m_errorMonitor->VerifyFound();
16266 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16267
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016268 // TODO: Update framework to easily passing mutable flag into ImageObj init
16269 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016270 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16271 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16272 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016273 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16274 // VIEW_CREATE_ERROR
16275 VkImageCreateInfo mutImgInfo = image.create_info();
16276 VkImage mutImage;
16277 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016278 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016279 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16280 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016281 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016282 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016283
16284 VkMemoryRequirements requirements;
16285 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16286
16287 VkMemoryAllocateInfo alloc_info{};
16288 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16289 alloc_info.pNext = NULL;
16290 alloc_info.memoryTypeIndex = 0;
16291 alloc_info.allocationSize = requirements.size;
16292 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16293 ASSERT_TRUE(pass);
16294
16295 VkDeviceMemory memory;
16296 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16297 ASSERT_VK_SUCCESS(ret);
16298
16299 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16300 ASSERT_VK_SUCCESS(ret);
16301
Tony Barbourd6673642016-05-05 14:46:39 -060016302 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016304 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16305 m_errorMonitor->VerifyFound();
16306 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016307
16308 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016309 vkDestroyImage(m_device->handle(), mutImage, NULL);
16310}
16311
Dave Houlton75967fc2017-03-06 17:21:16 -070016312TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16313 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16314
Tony Barbour1fa09702017-03-16 12:09:08 -060016315 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016316
Jamie Madill35127872017-03-15 16:17:46 -040016317 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016318 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16319 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16320 if (device_features.textureCompressionBC) {
16321 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16322 } else if (device_features.textureCompressionETC2) {
16323 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16324 } else if (device_features.textureCompressionASTC_LDR) {
16325 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16326 } else {
16327 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16328 return;
16329 }
16330
16331 VkImageCreateInfo ci;
16332 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16333 ci.pNext = NULL;
16334 ci.flags = 0;
16335 ci.imageType = VK_IMAGE_TYPE_2D;
16336 ci.format = compressed_format;
16337 ci.extent = {32, 32, 1};
16338 ci.mipLevels = 6;
16339 ci.arrayLayers = 1;
16340 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16341 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16342 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16343 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16344 ci.queueFamilyIndexCount = 0;
16345 ci.pQueueFamilyIndices = NULL;
16346 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16347
16348 VkImageObj image(m_device);
16349 image.init(&ci);
16350 ASSERT_TRUE(image.initialized());
16351
16352 VkImageObj odd_image(m_device);
16353 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16354 odd_image.init(&ci);
16355 ASSERT_TRUE(odd_image.initialized());
16356
16357 // Allocate buffers
16358 VkMemoryPropertyFlags reqs = 0;
16359 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16360 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16361 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16362 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16363 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16364
16365 VkBufferImageCopy region = {};
16366 region.bufferRowLength = 0;
16367 region.bufferImageHeight = 0;
16368 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16369 region.imageSubresource.layerCount = 1;
16370 region.imageOffset = {0, 0, 0};
16371 region.bufferOffset = 0;
16372
16373 // start recording
16374 m_commandBuffer->BeginCommandBuffer();
16375
16376 // Mip level copies that work - 5 levels
16377 m_errorMonitor->ExpectSuccess();
16378
16379 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16380 region.imageExtent = {32, 32, 1};
16381 region.imageSubresource.mipLevel = 0;
16382 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16383 &region);
16384 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16385 &region);
16386
16387 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16388 region.imageExtent = {8, 8, 1};
16389 region.imageSubresource.mipLevel = 2;
16390 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16391 &region);
16392 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16393 &region);
16394
16395 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16396 region.imageExtent = {4, 4, 1};
16397 region.imageSubresource.mipLevel = 3;
16398 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16399 &region);
16400 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16401 &region);
16402
16403 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16404 region.imageExtent = {2, 2, 1};
16405 region.imageSubresource.mipLevel = 4;
16406 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16407 &region);
16408 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16409 &region);
16410
16411 region.imageExtent = {1, 1, 1};
16412 region.imageSubresource.mipLevel = 5;
16413 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16414 &region);
16415 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16416 &region);
16417 m_errorMonitor->VerifyNotFound();
16418
16419 // Buffer must accomodate a full compressed block, regardless of texel count
16420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16421 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16422 &region);
16423 m_errorMonitor->VerifyFound();
16424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16425 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16426 &region);
16427 m_errorMonitor->VerifyFound();
16428
16429 // Copy width < compressed block size, but not the full mip width
16430 region.imageExtent = {1, 2, 1};
16431 region.imageSubresource.mipLevel = 4;
16432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16433 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16434 &region);
16435 m_errorMonitor->VerifyFound();
16436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16437 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16438 &region);
16439 m_errorMonitor->VerifyFound();
16440
16441 // Copy height < compressed block size but not the full mip height
16442 region.imageExtent = {2, 1, 1};
16443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16444 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16445 &region);
16446 m_errorMonitor->VerifyFound();
16447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16448 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16449 &region);
16450 m_errorMonitor->VerifyFound();
16451
16452 // Offsets must be multiple of compressed block size
16453 region.imageOffset = {1, 1, 0};
16454 region.imageExtent = {1, 1, 1};
16455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16456 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16457 &region);
16458 m_errorMonitor->VerifyFound();
16459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16460 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16461 &region);
16462 m_errorMonitor->VerifyFound();
16463
16464 // Offset + extent width = mip width - should succeed
16465 region.imageOffset = {4, 4, 0};
16466 region.imageExtent = {3, 4, 1};
16467 region.imageSubresource.mipLevel = 2;
16468 m_errorMonitor->ExpectSuccess();
16469 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16470 &region);
16471 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16472 &region);
16473 m_errorMonitor->VerifyNotFound();
16474
16475 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16476 region.imageExtent = {4, 4, 1};
16477 m_errorMonitor->ExpectSuccess();
16478 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16479 &region);
16480 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16481 &region);
16482 m_errorMonitor->VerifyNotFound();
16483
16484 // Offset + extent width < mip width and not a multiple of block width - should fail
16485 region.imageExtent = {3, 3, 1};
16486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16487 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16488 &region);
16489 m_errorMonitor->VerifyFound();
16490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16491 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16492 &region);
16493 m_errorMonitor->VerifyFound();
16494}
16495
Dave Houlton59a20702017-02-02 17:26:23 -070016496TEST_F(VkLayerTest, ImageBufferCopyTests) {
16497 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16498
Tony Barbour1fa09702017-03-16 12:09:08 -060016499 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016500 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16501 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16502 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16503 return;
16504 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016505
16506 // Bail if any dimension of transfer granularity is 0.
16507 auto index = m_device->graphics_queue_node_index_;
16508 auto queue_family_properties = m_device->phy().queue_properties();
16509 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16510 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16511 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16512 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16513 return;
16514 }
16515
Dave Houlton59a20702017-02-02 17:26:23 -070016516 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16517 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16518 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016519 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16520 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16521 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16522 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16523
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016524 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016525 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16526 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016527 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016528 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16529 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016530 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 -070016531 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016532 ASSERT_TRUE(image_64k.initialized());
16533 ASSERT_TRUE(image_16k.initialized());
16534 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016535
Dave Houltonf3229d52017-02-21 15:59:08 -070016536 // Verify all needed Depth/Stencil formats are supported
16537 bool missing_ds_support = false;
16538 VkFormatProperties props = {0, 0, 0};
16539 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16540 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16541 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16542 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16543 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16544 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16545 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16546 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16547
16548 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016549 ds_image_4D_1S.Init(
16550 256, 256, 1, VK_FORMAT_D32_SFLOAT_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_4D_1S.initialized());
16554
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016555 ds_image_3D_1S.Init(
16556 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016557 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);
16559 ASSERT_TRUE(ds_image_3D_1S.initialized());
16560
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016561 ds_image_2D.Init(
16562 256, 256, 1, VK_FORMAT_D16_UNORM,
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_2D.initialized());
16566
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016567 ds_image_1S.Init(
16568 256, 256, 1, VK_FORMAT_S8_UINT,
16569 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16570 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016571 ASSERT_TRUE(ds_image_1S.initialized());
16572 }
16573
16574 // Allocate buffers
16575 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016576 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016577 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16578 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16579 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16580 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016581
16582 VkBufferImageCopy region = {};
16583 region.bufferRowLength = 0;
16584 region.bufferImageHeight = 0;
16585 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16586 region.imageSubresource.layerCount = 1;
16587 region.imageOffset = {0, 0, 0};
16588 region.imageExtent = {64, 64, 1};
16589 region.bufferOffset = 0;
16590
16591 // attempt copies before putting command buffer in recording state
16592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16593 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16594 &region);
16595 m_errorMonitor->VerifyFound();
16596
16597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16598 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16599 &region);
16600 m_errorMonitor->VerifyFound();
16601
16602 // start recording
16603 m_commandBuffer->BeginCommandBuffer();
16604
16605 // successful copies
16606 m_errorMonitor->ExpectSuccess();
16607 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16608 &region);
16609 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16610 &region);
16611 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16612 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16613 &region);
16614 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16615 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16616 &region);
16617 region.imageOffset.x = 0;
16618 region.imageExtent.height = 64;
16619 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16620 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16621 &region);
16622 m_errorMonitor->VerifyNotFound();
16623
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016624 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016625 region.imageExtent = {65, 64, 1};
16626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16627 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16628 &region);
16629 m_errorMonitor->VerifyFound();
16630
16631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16632 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16633 &region);
16634 m_errorMonitor->VerifyFound();
16635
16636 // image/buffer too small (offset) on copy to image
16637 region.imageExtent = {64, 64, 1};
16638 region.imageOffset = {0, 4, 0};
16639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16640 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16641 &region);
16642 m_errorMonitor->VerifyFound();
16643
16644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16645 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16646 &region);
16647 m_errorMonitor->VerifyFound();
16648
16649 // image/buffer too small on copy to buffer
16650 region.imageExtent = {64, 64, 1};
16651 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016652 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16654 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16655 &region);
16656 m_errorMonitor->VerifyFound();
16657
16658 region.imageExtent = {64, 65, 1};
16659 region.bufferOffset = 0;
16660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16661 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16662 &region);
16663 m_errorMonitor->VerifyFound();
16664
16665 // buffer size ok but rowlength causes loose packing
16666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16667 region.imageExtent = {64, 64, 1};
16668 region.bufferRowLength = 68;
16669 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16670 &region);
16671 m_errorMonitor->VerifyFound();
16672
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016673 // An extent with zero area should produce a warning, but no error
16674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16675 region.imageExtent.width = 0;
16676 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16677 &region);
16678 m_errorMonitor->VerifyFound();
16679
Dave Houlton59a20702017-02-02 17:26:23 -070016680 // aspect bits
16681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16682 region.imageExtent = {64, 64, 1};
16683 region.bufferRowLength = 0;
16684 region.bufferImageHeight = 0;
16685 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16686 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16687 buffer_16k.handle(), 1, &region);
16688 m_errorMonitor->VerifyFound();
16689
16690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16691 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16692 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16693 &region);
16694 m_errorMonitor->VerifyFound();
16695
16696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16697 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16698 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16699 buffer_16k.handle(), 1, &region);
16700 m_errorMonitor->VerifyFound();
16701
Dave Houltonf3229d52017-02-21 15:59:08 -070016702 // Test Depth/Stencil copies
16703 if (missing_ds_support) {
16704 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16705 } else {
16706 VkBufferImageCopy ds_region = {};
16707 ds_region.bufferOffset = 0;
16708 ds_region.bufferRowLength = 0;
16709 ds_region.bufferImageHeight = 0;
16710 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16711 ds_region.imageSubresource.mipLevel = 0;
16712 ds_region.imageSubresource.baseArrayLayer = 0;
16713 ds_region.imageSubresource.layerCount = 1;
16714 ds_region.imageOffset = {0, 0, 0};
16715 ds_region.imageExtent = {256, 256, 1};
16716
16717 // Depth copies that should succeed
16718 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16719 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16720 buffer_256k.handle(), 1, &ds_region);
16721 m_errorMonitor->VerifyNotFound();
16722
16723 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16724 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16725 buffer_256k.handle(), 1, &ds_region);
16726 m_errorMonitor->VerifyNotFound();
16727
16728 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16729 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16730 buffer_128k.handle(), 1, &ds_region);
16731 m_errorMonitor->VerifyNotFound();
16732
16733 // Depth copies that should fail
16734 ds_region.bufferOffset = 4;
16735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16736 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16737 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_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); // Extract 3b depth per texel, pack (loose) into 256k buffer
16743 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16744 buffer_256k.handle(), 1, &ds_region);
16745 m_errorMonitor->VerifyFound();
16746
16747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16748 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16749 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16750 buffer_128k.handle(), 1, &ds_region);
16751 m_errorMonitor->VerifyFound();
16752
16753 // Stencil copies that should succeed
16754 ds_region.bufferOffset = 0;
16755 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16756 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16757 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16758 buffer_64k.handle(), 1, &ds_region);
16759 m_errorMonitor->VerifyNotFound();
16760
16761 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16762 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16763 buffer_64k.handle(), 1, &ds_region);
16764 m_errorMonitor->VerifyNotFound();
16765
16766 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16767 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16768 buffer_64k.handle(), 1, &ds_region);
16769 m_errorMonitor->VerifyNotFound();
16770
16771 // Stencil copies that should fail
16772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16773 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16774 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16775 buffer_16k.handle(), 1, &ds_region);
16776 m_errorMonitor->VerifyFound();
16777
16778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16779 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16780 ds_region.bufferRowLength = 260;
16781 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16782 buffer_64k.handle(), 1, &ds_region);
16783 m_errorMonitor->VerifyFound();
16784
16785 ds_region.bufferRowLength = 0;
16786 ds_region.bufferOffset = 4;
16787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16788 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16789 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16790 buffer_64k.handle(), 1, &ds_region);
16791 m_errorMonitor->VerifyFound();
16792 }
16793
Dave Houlton584d51e2017-02-16 12:52:54 -070016794 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016795 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016796 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016797 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16798 device_features.textureCompressionASTC_LDR)) {
16799 printf(" No compressed formats supported - block compression tests skipped.\n");
16800 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016801 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16802 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016803 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016804 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16805 0);
16806 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 -070016807 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016808 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016809 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 -070016810 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016811 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 -070016812 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016813 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016814 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 -070016815 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016816 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 -070016817 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016818 }
16819 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016820
Dave Houlton584d51e2017-02-16 12:52:54 -070016821 // Just fits
16822 m_errorMonitor->ExpectSuccess();
16823 region.imageExtent = {128, 128, 1};
16824 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16825 buffer_16k.handle(), 1, &region);
16826 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016827
Dave Houlton584d51e2017-02-16 12:52:54 -070016828 // with offset, too big for buffer
16829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16830 region.bufferOffset = 16;
16831 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16832 buffer_16k.handle(), 1, &region);
16833 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016834 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016835
Dave Houlton67e9b532017-03-02 17:00:10 -070016836 // extents that are not a multiple of compressed block size
16837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16838 region.imageExtent.width = 66;
16839 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16840 buffer_16k.handle(), 1, &region);
16841 m_errorMonitor->VerifyFound();
16842 region.imageExtent.width = 128;
16843
16844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016845 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016846 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16847 buffer_16k.handle(), 1, &region);
16848 m_errorMonitor->VerifyFound();
16849 region.imageExtent.height = 128;
16850
16851 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16852
16853 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16854 m_errorMonitor->ExpectSuccess();
16855 region.imageExtent.width = 66;
16856 region.imageOffset.x = 64;
16857 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16858 buffer_16k.handle(), 1, &region);
16859 region.imageExtent.width = 16;
16860 region.imageOffset.x = 0;
16861 region.imageExtent.height = 2;
16862 region.imageOffset.y = 128;
16863 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016864 buffer_16k.handle(), 1, &region);
16865 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016866 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016867
Dave Houlton584d51e2017-02-16 12:52:54 -070016868 // buffer offset must be a multiple of texel block size (16)
16869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16871 region.imageExtent = {64, 64, 1};
16872 region.bufferOffset = 24;
16873 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16874 buffer_16k.handle(), 1, &region);
16875 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016876
Dave Houlton584d51e2017-02-16 12:52:54 -070016877 // rowlength not a multiple of block width (4)
16878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16879 region.bufferOffset = 0;
16880 region.bufferRowLength = 130;
16881 region.bufferImageHeight = 0;
16882 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16883 buffer_64k.handle(), 1, &region);
16884 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016885
Dave Houlton584d51e2017-02-16 12:52:54 -070016886 // imageheight not a multiple of block height (4)
16887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16888 region.bufferRowLength = 0;
16889 region.bufferImageHeight = 130;
16890 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16891 buffer_64k.handle(), 1, &region);
16892 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016893 }
Dave Houlton59a20702017-02-02 17:26:23 -070016894}
16895
Tony Barbourd6673642016-05-05 14:46:39 -060016896TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016897 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016898
Tony Barbour1fa09702017-03-16 12:09:08 -060016899 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016900
Rene Lindsay135204f2016-12-22 17:11:09 -070016901 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016902 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016903 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 -070016904 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016905 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016906 vk_testing::Buffer buffer;
16907 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016908 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016909 VkBufferImageCopy region = {};
16910 region.bufferRowLength = 128;
16911 region.bufferImageHeight = 128;
16912 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16913 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016914 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016915 region.imageExtent.height = 4;
16916 region.imageExtent.width = 4;
16917 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016918
16919 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016920 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 -070016921 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016922 ASSERT_TRUE(image2.initialized());
16923 vk_testing::Buffer buffer2;
16924 VkMemoryPropertyFlags reqs2 = 0;
16925 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16926 VkBufferImageCopy region2 = {};
16927 region2.bufferRowLength = 128;
16928 region2.bufferImageHeight = 128;
16929 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16930 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16931 region2.imageSubresource.layerCount = 1;
16932 region2.imageExtent.height = 4;
16933 region2.imageExtent.width = 4;
16934 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016935 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016936
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016937 // Image must have offset.z of 0 and extent.depth of 1
16938 // Introduce failure by setting imageExtent.depth to 0
16939 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016941 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016942 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016943 m_errorMonitor->VerifyFound();
16944
16945 region.imageExtent.depth = 1;
16946
16947 // Image must have offset.z of 0 and extent.depth of 1
16948 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016949 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016950 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016953 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016954 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016955 m_errorMonitor->VerifyFound();
16956
16957 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016958 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16959 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016960 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016962 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16963 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016964 m_errorMonitor->VerifyFound();
16965
16966 // BufferOffset must be a multiple of 4
16967 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016968 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016970 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16971 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016972 m_errorMonitor->VerifyFound();
16973
16974 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16975 region.bufferOffset = 0;
16976 region.imageExtent.height = 128;
16977 region.imageExtent.width = 128;
16978 // Introduce failure by setting bufferRowLength > 0 but less than width
16979 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016981 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16982 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016983 m_errorMonitor->VerifyFound();
16984
16985 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16986 region.bufferRowLength = 128;
16987 // Introduce failure by setting bufferRowHeight > 0 but less than height
16988 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016990 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16991 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016992 m_errorMonitor->VerifyFound();
16993
16994 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016995 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016996 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 -070016997 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016998 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016999 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 -070017000 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017001 VkImageBlit blitRegion = {};
17002 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17003 blitRegion.srcSubresource.baseArrayLayer = 0;
17004 blitRegion.srcSubresource.layerCount = 1;
17005 blitRegion.srcSubresource.mipLevel = 0;
17006 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17007 blitRegion.dstSubresource.baseArrayLayer = 0;
17008 blitRegion.dstSubresource.layerCount = 1;
17009 blitRegion.dstSubresource.mipLevel = 0;
17010
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017011 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17013 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17015 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017016 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17017 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017018 m_errorMonitor->VerifyFound();
17019
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017021 VkImageMemoryBarrier img_barrier;
17022 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17023 img_barrier.pNext = NULL;
17024 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17025 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17026 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17027 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17028 img_barrier.image = image.handle();
17029 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17030 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17031 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17032 img_barrier.subresourceRange.baseArrayLayer = 0;
17033 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017034 img_barrier.subresourceRange.layerCount = 0;
17035 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017036 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17037 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017038 m_errorMonitor->VerifyFound();
17039 img_barrier.subresourceRange.layerCount = 1;
17040}
17041
17042TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017043 TEST_DESCRIPTION("Exceed the limits of image format ");
17044
Tony Barbour1fa09702017-03-16 12:09:08 -060017045 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017046
17047 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17048 {
17049 VkFormatProperties properties;
17050 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17051 if (properties.linearTilingFeatures == 0) {
17052 printf(" Image format not supported; skipped.\n");
17053 return;
17054 }
17055 }
17056
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017058 VkImageCreateInfo image_create_info = {};
17059 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17060 image_create_info.pNext = NULL;
17061 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017062 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017063 image_create_info.extent.width = 32;
17064 image_create_info.extent.height = 32;
17065 image_create_info.extent.depth = 1;
17066 image_create_info.mipLevels = 1;
17067 image_create_info.arrayLayers = 1;
17068 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17069 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17070 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17071 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17072 image_create_info.flags = 0;
17073
17074 VkImage nullImg;
17075 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017076 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17077 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017078 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017079 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17080 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17081 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017082 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017083
Tony Barbour0907e362017-03-09 15:05:30 -070017084 uint32_t maxDim =
17085 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17086 // If max mip levels exceeds image extents, skip the max mip levels test
17087 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17089 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17090 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17091 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17092 m_errorMonitor->VerifyFound();
17093 image_create_info.mipLevels = 1;
17094 }
Tony Barbourd6673642016-05-05 14:46:39 -060017095
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017097 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17098 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17099 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17100 m_errorMonitor->VerifyFound();
17101 image_create_info.arrayLayers = 1;
17102
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017104 int samples = imgFmtProps.sampleCounts >> 1;
17105 image_create_info.samples = (VkSampleCountFlagBits)samples;
17106 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17107 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17108 m_errorMonitor->VerifyFound();
17109 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17110
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17112 "pCreateInfo->initialLayout, must be "
17113 "VK_IMAGE_LAYOUT_UNDEFINED or "
17114 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017115 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17116 // Expect INVALID_LAYOUT
17117 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17118 m_errorMonitor->VerifyFound();
17119 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17120}
17121
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017122TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017123 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017125
Tony Barbour1fa09702017-03-16 12:09:08 -060017126 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017127
17128 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017129 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 -060017130 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017131 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 -060017132
Tony Barbour552f6c02016-12-21 14:34:07 -070017133 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017134 VkImageCopy copy_region;
17135 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17136 copy_region.srcSubresource.mipLevel = 0;
17137 copy_region.srcSubresource.baseArrayLayer = 0;
17138 copy_region.srcSubresource.layerCount = 0;
17139 copy_region.srcOffset.x = 0;
17140 copy_region.srcOffset.y = 0;
17141 copy_region.srcOffset.z = 0;
17142 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17143 copy_region.dstSubresource.mipLevel = 0;
17144 copy_region.dstSubresource.baseArrayLayer = 0;
17145 copy_region.dstSubresource.layerCount = 0;
17146 copy_region.dstOffset.x = 0;
17147 copy_region.dstOffset.y = 0;
17148 copy_region.dstOffset.z = 0;
17149 copy_region.extent.width = 64;
17150 copy_region.extent.height = 64;
17151 copy_region.extent.depth = 1;
17152 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17153 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017154 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017155
17156 m_errorMonitor->VerifyFound();
17157}
17158
17159TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017160 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017161 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017162
Tony Barbour1fa09702017-03-16 12:09:08 -060017163 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017164
17165 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017166 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 -060017167 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017168 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 -060017169
Tony Barbour552f6c02016-12-21 14:34:07 -070017170 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017171 VkImageCopy copy_region;
17172 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17173 copy_region.srcSubresource.mipLevel = 0;
17174 copy_region.srcSubresource.baseArrayLayer = 0;
17175 copy_region.srcSubresource.layerCount = 0;
17176 copy_region.srcOffset.x = 0;
17177 copy_region.srcOffset.y = 0;
17178 copy_region.srcOffset.z = 0;
17179 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17180 copy_region.dstSubresource.mipLevel = 0;
17181 copy_region.dstSubresource.baseArrayLayer = 0;
17182 copy_region.dstSubresource.layerCount = 0;
17183 copy_region.dstOffset.x = 0;
17184 copy_region.dstOffset.y = 0;
17185 copy_region.dstOffset.z = 0;
17186 copy_region.extent.width = 64;
17187 copy_region.extent.height = 64;
17188 copy_region.extent.depth = 1;
17189 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17190 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017191 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017192
17193 m_errorMonitor->VerifyFound();
17194}
17195
Karl Schultz6addd812016-02-02 17:17:23 -070017196TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017197 VkResult err;
17198 bool pass;
17199
17200 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017202
Tony Barbour1fa09702017-03-16 12:09:08 -060017203 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017204
17205 // Create two images of different types and try to copy between them
17206 VkImage srcImage;
17207 VkImage dstImage;
17208 VkDeviceMemory srcMem;
17209 VkDeviceMemory destMem;
17210 VkMemoryRequirements memReqs;
17211
17212 VkImageCreateInfo image_create_info = {};
17213 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17214 image_create_info.pNext = NULL;
17215 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17216 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17217 image_create_info.extent.width = 32;
17218 image_create_info.extent.height = 32;
17219 image_create_info.extent.depth = 1;
17220 image_create_info.mipLevels = 1;
17221 image_create_info.arrayLayers = 1;
17222 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17223 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17224 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17225 image_create_info.flags = 0;
17226
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017227 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017228 ASSERT_VK_SUCCESS(err);
17229
17230 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17231 // Introduce failure by creating second image with a different-sized format.
17232 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017233 VkFormatProperties properties;
17234 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17235 if (properties.optimalTilingFeatures == 0) {
17236 printf(" Image format not supported; skipped.\n");
17237 return;
17238 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017239
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017240 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017241 ASSERT_VK_SUCCESS(err);
17242
17243 // Allocate memory
17244 VkMemoryAllocateInfo memAlloc = {};
17245 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17246 memAlloc.pNext = NULL;
17247 memAlloc.allocationSize = 0;
17248 memAlloc.memoryTypeIndex = 0;
17249
17250 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17251 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017252 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017253 ASSERT_TRUE(pass);
17254 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17255 ASSERT_VK_SUCCESS(err);
17256
17257 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17258 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017259 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017260 ASSERT_TRUE(pass);
17261 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17262 ASSERT_VK_SUCCESS(err);
17263
17264 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17265 ASSERT_VK_SUCCESS(err);
17266 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17267 ASSERT_VK_SUCCESS(err);
17268
Tony Barbour552f6c02016-12-21 14:34:07 -070017269 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017270 VkImageCopy copyRegion;
17271 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17272 copyRegion.srcSubresource.mipLevel = 0;
17273 copyRegion.srcSubresource.baseArrayLayer = 0;
17274 copyRegion.srcSubresource.layerCount = 0;
17275 copyRegion.srcOffset.x = 0;
17276 copyRegion.srcOffset.y = 0;
17277 copyRegion.srcOffset.z = 0;
17278 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17279 copyRegion.dstSubresource.mipLevel = 0;
17280 copyRegion.dstSubresource.baseArrayLayer = 0;
17281 copyRegion.dstSubresource.layerCount = 0;
17282 copyRegion.dstOffset.x = 0;
17283 copyRegion.dstOffset.y = 0;
17284 copyRegion.dstOffset.z = 0;
17285 copyRegion.extent.width = 1;
17286 copyRegion.extent.height = 1;
17287 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017288 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017289 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017290
17291 m_errorMonitor->VerifyFound();
17292
17293 vkDestroyImage(m_device->device(), srcImage, NULL);
17294 vkDestroyImage(m_device->device(), dstImage, NULL);
17295 vkFreeMemory(m_device->device(), srcMem, NULL);
17296 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017297}
17298
Karl Schultz6addd812016-02-02 17:17:23 -070017299TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17300 VkResult err;
17301 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017302
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017303 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17305 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017306
Tony Barbour1fa09702017-03-16 12:09:08 -060017307 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017308 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017309 if (!depth_format) {
17310 return;
17311 }
Mike Stroyana3082432015-09-25 13:39:21 -060017312
17313 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017314 VkImage srcImage;
17315 VkImage dstImage;
17316 VkDeviceMemory srcMem;
17317 VkDeviceMemory destMem;
17318 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017319
17320 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017321 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17322 image_create_info.pNext = NULL;
17323 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017324 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017325 image_create_info.extent.width = 32;
17326 image_create_info.extent.height = 32;
17327 image_create_info.extent.depth = 1;
17328 image_create_info.mipLevels = 1;
17329 image_create_info.arrayLayers = 1;
17330 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060017331 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070017332 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17333 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017334 VkFormatProperties properties;
17335 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17336 if (properties.optimalTilingFeatures == 0) {
17337 printf(" Image format not supported; skipped.\n");
17338 return;
17339 }
Mike Stroyana3082432015-09-25 13:39:21 -060017340
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017341 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017342 ASSERT_VK_SUCCESS(err);
17343
Karl Schultzbdb75952016-04-19 11:36:49 -060017344 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17345
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017346 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017347 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017348 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017349 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017350
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017351 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017352 ASSERT_VK_SUCCESS(err);
17353
17354 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017355 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017356 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17357 memAlloc.pNext = NULL;
17358 memAlloc.allocationSize = 0;
17359 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017360
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017361 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017362 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017363 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017364 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017365 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017366 ASSERT_VK_SUCCESS(err);
17367
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017368 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017369 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017370 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017371 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017372 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017373 ASSERT_VK_SUCCESS(err);
17374
17375 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17376 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017377 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017378 ASSERT_VK_SUCCESS(err);
17379
Tony Barbour552f6c02016-12-21 14:34:07 -070017380 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017381 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017382 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017383 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017384 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017385 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017386 copyRegion.srcOffset.x = 0;
17387 copyRegion.srcOffset.y = 0;
17388 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017389 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017390 copyRegion.dstSubresource.mipLevel = 0;
17391 copyRegion.dstSubresource.baseArrayLayer = 0;
17392 copyRegion.dstSubresource.layerCount = 0;
17393 copyRegion.dstOffset.x = 0;
17394 copyRegion.dstOffset.y = 0;
17395 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017396 copyRegion.extent.width = 1;
17397 copyRegion.extent.height = 1;
17398 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017399 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017400 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017401
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017402 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017403
Chia-I Wuf7458c52015-10-26 21:10:41 +080017404 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017405 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017406 vkFreeMemory(m_device->device(), srcMem, NULL);
17407 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017408}
17409
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017410TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17411 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017412
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017413 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017414
17415 VkImageFormatProperties image_format_properties;
17416 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17417 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17418 &image_format_properties);
17419
17420 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17421 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17422 printf(" Image multi-sample support not found; skipped.\n");
17423 return;
17424 }
17425
17426 VkImageCreateInfo ci;
17427 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17428 ci.pNext = NULL;
17429 ci.flags = 0;
17430 ci.imageType = VK_IMAGE_TYPE_2D;
17431 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17432 ci.extent = {128, 128, 1};
17433 ci.mipLevels = 1;
17434 ci.arrayLayers = 1;
17435 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17436 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17437 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17438 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17439 ci.queueFamilyIndexCount = 0;
17440 ci.pQueueFamilyIndices = NULL;
17441 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17442
17443 VkImageObj image1(m_device);
17444 image1.init(&ci);
17445 ASSERT_TRUE(image1.initialized());
17446
17447 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17448 VkImageObj image2(m_device);
17449 image2.init(&ci);
17450 ASSERT_TRUE(image2.initialized());
17451
17452 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17453 VkImageObj image4(m_device);
17454 image4.init(&ci);
17455 ASSERT_TRUE(image4.initialized());
17456
17457 m_commandBuffer->BeginCommandBuffer();
17458
17459 VkImageCopy copyRegion;
17460 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17461 copyRegion.srcSubresource.mipLevel = 0;
17462 copyRegion.srcSubresource.baseArrayLayer = 0;
17463 copyRegion.srcSubresource.layerCount = 1;
17464 copyRegion.srcOffset = {0, 0, 0};
17465 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17466 copyRegion.dstSubresource.mipLevel = 0;
17467 copyRegion.dstSubresource.baseArrayLayer = 0;
17468 copyRegion.dstSubresource.layerCount = 1;
17469 copyRegion.dstOffset = {0, 0, 0};
17470 copyRegion.extent = {128, 128, 1};
17471
17472 // Copy a single sample image to/from a multi-sample image
17473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17474 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17475 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17476 m_errorMonitor->VerifyFound();
17477
17478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17479 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17480 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17481 m_errorMonitor->VerifyFound();
17482
17483 // Copy between multi-sample images with different sample counts
17484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17485 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17486 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17487 m_errorMonitor->VerifyFound();
17488
17489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17490 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17491 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17492 m_errorMonitor->VerifyFound();
17493
17494 m_commandBuffer->EndCommandBuffer();
17495}
17496
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017497TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17498 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017499 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017500 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017501 if (!ds_format) {
17502 return;
17503 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017504
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017505 VkFormatProperties properties;
17506 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
17507 if (properties.optimalTilingFeatures == 0) {
17508 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
17509 return;
17510 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017511 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017512 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 -060017513 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 -060017514 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017515 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17516 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017517 ASSERT_TRUE(color_image.initialized());
17518 ASSERT_TRUE(depth_image.initialized());
17519 ASSERT_TRUE(ds_image.initialized());
17520
17521 VkImageCopy copyRegion;
17522 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17523 copyRegion.srcSubresource.mipLevel = 0;
17524 copyRegion.srcSubresource.baseArrayLayer = 0;
17525 copyRegion.srcSubresource.layerCount = 1;
17526 copyRegion.srcOffset = {0, 0, 0};
17527 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17528 copyRegion.dstSubresource.mipLevel = 0;
17529 copyRegion.dstSubresource.baseArrayLayer = 0;
17530 copyRegion.dstSubresource.layerCount = 1;
17531 copyRegion.dstOffset = {64, 0, 0};
17532 copyRegion.extent = {64, 128, 1};
17533
17534 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17536 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17537 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17538 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017539 m_errorMonitor->VerifyFound();
17540
17541 m_commandBuffer->BeginCommandBuffer();
17542
17543 // Src and dest aspect masks don't match
17544 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017546 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17547 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017548 m_errorMonitor->VerifyFound();
17549 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17550
17551 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017552 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017553 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17555 // These aspect/format mismatches are redundant but unavoidable here
17556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017558 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17559 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017560 m_errorMonitor->VerifyFound();
17561 // Metadata aspect is illegal - VU 01222
17562 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17563 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17565 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017566 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17567 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017568 m_errorMonitor->VerifyFound();
17569
17570 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17571 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17572
17573 // Aspect mask doesn't match source image format - VU 01200
17574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17575 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17577 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17578 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17579 m_errorMonitor->VerifyFound();
17580
17581 // Aspect mask doesn't match dest image format - VU 01201
17582 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17583 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17585 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17587 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17588 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17589 m_errorMonitor->VerifyFound();
17590
17591 m_commandBuffer->EndCommandBuffer();
17592}
17593
Karl Schultz6addd812016-02-02 17:17:23 -070017594TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17595 VkResult err;
17596 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017597
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17599 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017600
Tony Barbour1fa09702017-03-16 12:09:08 -060017601 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017602
17603 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017604 VkImage srcImage;
17605 VkImage dstImage;
17606 VkDeviceMemory srcMem;
17607 VkDeviceMemory destMem;
17608 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017609
17610 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017611 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17612 image_create_info.pNext = NULL;
17613 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17614 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17615 image_create_info.extent.width = 32;
17616 image_create_info.extent.height = 1;
17617 image_create_info.extent.depth = 1;
17618 image_create_info.mipLevels = 1;
17619 image_create_info.arrayLayers = 1;
17620 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17621 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17622 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17623 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017624
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017625 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017626 ASSERT_VK_SUCCESS(err);
17627
Karl Schultz6addd812016-02-02 17:17:23 -070017628 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017629
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017630 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017631 ASSERT_VK_SUCCESS(err);
17632
17633 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017634 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017635 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17636 memAlloc.pNext = NULL;
17637 memAlloc.allocationSize = 0;
17638 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017639
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017640 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017641 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017642 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017643 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017644 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017645 ASSERT_VK_SUCCESS(err);
17646
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017647 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017648 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017649 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017650 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017651 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017652 ASSERT_VK_SUCCESS(err);
17653
17654 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17655 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017656 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017657 ASSERT_VK_SUCCESS(err);
17658
Tony Barbour552f6c02016-12-21 14:34:07 -070017659 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017660 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017661 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17662 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017663 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017664 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017665 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017666 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017667 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017668 resolveRegion.srcOffset.x = 0;
17669 resolveRegion.srcOffset.y = 0;
17670 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017671 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017672 resolveRegion.dstSubresource.mipLevel = 0;
17673 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017674 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017675 resolveRegion.dstOffset.x = 0;
17676 resolveRegion.dstOffset.y = 0;
17677 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017678 resolveRegion.extent.width = 1;
17679 resolveRegion.extent.height = 1;
17680 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017681 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017682 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017683
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017684 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017685
Chia-I Wuf7458c52015-10-26 21:10:41 +080017686 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017687 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017688 vkFreeMemory(m_device->device(), srcMem, NULL);
17689 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017690}
17691
Karl Schultz6addd812016-02-02 17:17:23 -070017692TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17693 VkResult err;
17694 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017695
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17697 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017698
Tony Barbour1fa09702017-03-16 12:09:08 -060017699 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017700
Chris Forbesa7530692016-05-08 12:35:39 +120017701 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017702 VkImage srcImage;
17703 VkImage dstImage;
17704 VkDeviceMemory srcMem;
17705 VkDeviceMemory destMem;
17706 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017707
17708 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017709 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17710 image_create_info.pNext = NULL;
17711 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17712 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17713 image_create_info.extent.width = 32;
17714 image_create_info.extent.height = 1;
17715 image_create_info.extent.depth = 1;
17716 image_create_info.mipLevels = 1;
17717 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017718 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017719 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17720 // Note: Some implementations expect color attachment usage for any
17721 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017722 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017723 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017724
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017725 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017726 ASSERT_VK_SUCCESS(err);
17727
Karl Schultz6addd812016-02-02 17:17:23 -070017728 // Note: Some implementations expect color attachment usage for any
17729 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017730 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017731
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017732 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017733 ASSERT_VK_SUCCESS(err);
17734
17735 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017736 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017737 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17738 memAlloc.pNext = NULL;
17739 memAlloc.allocationSize = 0;
17740 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017741
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017742 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017743 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017744 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017745 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017746 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017747 ASSERT_VK_SUCCESS(err);
17748
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017749 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017750 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017751 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017752 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017753 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017754 ASSERT_VK_SUCCESS(err);
17755
17756 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17757 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017758 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017759 ASSERT_VK_SUCCESS(err);
17760
Tony Barbour552f6c02016-12-21 14:34:07 -070017761 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017762 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017763 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17764 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017765 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017766 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017767 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017768 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017769 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017770 resolveRegion.srcOffset.x = 0;
17771 resolveRegion.srcOffset.y = 0;
17772 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017773 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017774 resolveRegion.dstSubresource.mipLevel = 0;
17775 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017776 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017777 resolveRegion.dstOffset.x = 0;
17778 resolveRegion.dstOffset.y = 0;
17779 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017780 resolveRegion.extent.width = 1;
17781 resolveRegion.extent.height = 1;
17782 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017783 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017784 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017785
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017786 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017787
Chia-I Wuf7458c52015-10-26 21:10:41 +080017788 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017789 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017790 vkFreeMemory(m_device->device(), srcMem, NULL);
17791 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017792}
17793
Karl Schultz6addd812016-02-02 17:17:23 -070017794TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17795 VkResult err;
17796 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017797
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017799 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017800
Tony Barbour1fa09702017-03-16 12:09:08 -060017801 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017802
17803 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017804 VkImage srcImage;
17805 VkImage dstImage;
17806 VkDeviceMemory srcMem;
17807 VkDeviceMemory destMem;
17808 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017809
17810 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017811 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17812 image_create_info.pNext = NULL;
17813 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17814 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17815 image_create_info.extent.width = 32;
17816 image_create_info.extent.height = 1;
17817 image_create_info.extent.depth = 1;
17818 image_create_info.mipLevels = 1;
17819 image_create_info.arrayLayers = 1;
17820 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17821 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17822 // Note: Some implementations expect color attachment usage for any
17823 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017824 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017825 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017826
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017827 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017828 ASSERT_VK_SUCCESS(err);
17829
Karl Schultz6addd812016-02-02 17:17:23 -070017830 // Set format to something other than source image
17831 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17832 // Note: Some implementations expect color attachment usage for any
17833 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017834 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017835 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017836
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017837 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017838 ASSERT_VK_SUCCESS(err);
17839
17840 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017841 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017842 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17843 memAlloc.pNext = NULL;
17844 memAlloc.allocationSize = 0;
17845 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017846
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017847 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017848 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017849 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017850 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017851 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017852 ASSERT_VK_SUCCESS(err);
17853
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017854 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017855 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017856 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017857 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017858 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017859 ASSERT_VK_SUCCESS(err);
17860
17861 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17862 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017863 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017864 ASSERT_VK_SUCCESS(err);
17865
Tony Barbour552f6c02016-12-21 14:34:07 -070017866 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017867 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017868 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17869 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017870 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017871 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017872 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017873 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017874 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017875 resolveRegion.srcOffset.x = 0;
17876 resolveRegion.srcOffset.y = 0;
17877 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017878 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017879 resolveRegion.dstSubresource.mipLevel = 0;
17880 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017881 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017882 resolveRegion.dstOffset.x = 0;
17883 resolveRegion.dstOffset.y = 0;
17884 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017885 resolveRegion.extent.width = 1;
17886 resolveRegion.extent.height = 1;
17887 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017888 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017889 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017890
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017891 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017892
Chia-I Wuf7458c52015-10-26 21:10:41 +080017893 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017894 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017895 vkFreeMemory(m_device->device(), srcMem, NULL);
17896 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017897}
17898
Karl Schultz6addd812016-02-02 17:17:23 -070017899TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17900 VkResult err;
17901 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017902
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017904 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017905
Tony Barbour1fa09702017-03-16 12:09:08 -060017906 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017907
17908 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017909 VkImage srcImage;
17910 VkImage dstImage;
17911 VkDeviceMemory srcMem;
17912 VkDeviceMemory destMem;
17913 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017914
17915 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017916 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17917 image_create_info.pNext = NULL;
17918 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17919 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17920 image_create_info.extent.width = 32;
17921 image_create_info.extent.height = 1;
17922 image_create_info.extent.depth = 1;
17923 image_create_info.mipLevels = 1;
17924 image_create_info.arrayLayers = 1;
17925 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17926 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17927 // Note: Some implementations expect color attachment usage for any
17928 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017929 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017930 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017931
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017932 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017933 ASSERT_VK_SUCCESS(err);
17934
Karl Schultz6addd812016-02-02 17:17:23 -070017935 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17936 // Note: Some implementations expect color attachment usage for any
17937 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017938 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017939 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017940
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017941 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017942 ASSERT_VK_SUCCESS(err);
17943
17944 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017945 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017946 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17947 memAlloc.pNext = NULL;
17948 memAlloc.allocationSize = 0;
17949 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017950
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017951 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017952 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017953 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017954 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017955 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017956 ASSERT_VK_SUCCESS(err);
17957
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017958 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017959 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017960 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017961 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017962 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017963 ASSERT_VK_SUCCESS(err);
17964
17965 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17966 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017967 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017968 ASSERT_VK_SUCCESS(err);
17969
Tony Barbour552f6c02016-12-21 14:34:07 -070017970 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017971 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017972 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17973 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017974 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017975 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017976 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017977 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017978 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017979 resolveRegion.srcOffset.x = 0;
17980 resolveRegion.srcOffset.y = 0;
17981 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017982 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017983 resolveRegion.dstSubresource.mipLevel = 0;
17984 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017985 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017986 resolveRegion.dstOffset.x = 0;
17987 resolveRegion.dstOffset.y = 0;
17988 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017989 resolveRegion.extent.width = 1;
17990 resolveRegion.extent.height = 1;
17991 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017992 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017993 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017994
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017995 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017996
Chia-I Wuf7458c52015-10-26 21:10:41 +080017997 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017998 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017999 vkFreeMemory(m_device->device(), srcMem, NULL);
18000 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018001}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018002
Karl Schultz6addd812016-02-02 17:17:23 -070018003TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018004 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070018005 // to using a DS format, then cause it to hit error due to COLOR_BIT not
18006 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018007 // The image format check comes 2nd in validation so we trigger it first,
18008 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070018009 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018010
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18012 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018013
Tony Barbour1fa09702017-03-16 12:09:08 -060018014 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018015 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018016 if (!depth_format) {
18017 return;
18018 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018019
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018020 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018021 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18022 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018023
18024 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018025 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18026 ds_pool_ci.pNext = NULL;
18027 ds_pool_ci.maxSets = 1;
18028 ds_pool_ci.poolSizeCount = 1;
18029 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018030
18031 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018032 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018033 ASSERT_VK_SUCCESS(err);
18034
18035 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018036 dsl_binding.binding = 0;
18037 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18038 dsl_binding.descriptorCount = 1;
18039 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18040 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018041
18042 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018043 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18044 ds_layout_ci.pNext = NULL;
18045 ds_layout_ci.bindingCount = 1;
18046 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018047 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018048 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018049 ASSERT_VK_SUCCESS(err);
18050
18051 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018052 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018053 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018054 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018055 alloc_info.descriptorPool = ds_pool;
18056 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018057 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018058 ASSERT_VK_SUCCESS(err);
18059
Karl Schultz6addd812016-02-02 17:17:23 -070018060 VkImage image_bad;
18061 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018062 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018063 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018064 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018065 const int32_t tex_width = 32;
18066 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018067
18068 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018069 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18070 image_create_info.pNext = NULL;
18071 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18072 image_create_info.format = tex_format_bad;
18073 image_create_info.extent.width = tex_width;
18074 image_create_info.extent.height = tex_height;
18075 image_create_info.extent.depth = 1;
18076 image_create_info.mipLevels = 1;
18077 image_create_info.arrayLayers = 1;
18078 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18079 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018080 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018081 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018082
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018083 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018084 ASSERT_VK_SUCCESS(err);
18085 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018086 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18087 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018088 ASSERT_VK_SUCCESS(err);
18089
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018090 // ---Bind image memory---
18091 VkMemoryRequirements img_mem_reqs;
18092 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18093 VkMemoryAllocateInfo image_alloc_info = {};
18094 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18095 image_alloc_info.pNext = NULL;
18096 image_alloc_info.memoryTypeIndex = 0;
18097 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018098 bool pass =
18099 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 -070018100 ASSERT_TRUE(pass);
18101 VkDeviceMemory mem;
18102 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18103 ASSERT_VK_SUCCESS(err);
18104 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18105 ASSERT_VK_SUCCESS(err);
18106 // -----------------------
18107
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018108 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018109 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018110 image_view_create_info.image = image_bad;
18111 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18112 image_view_create_info.format = tex_format_bad;
18113 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18114 image_view_create_info.subresourceRange.baseMipLevel = 0;
18115 image_view_create_info.subresourceRange.layerCount = 1;
18116 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018117 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018118
18119 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018120 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018121
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018122 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018123
Chia-I Wuf7458c52015-10-26 21:10:41 +080018124 vkDestroyImage(m_device->device(), image_bad, NULL);
18125 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018126 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18127 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018128
18129 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018130}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018131
18132TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018133 TEST_DESCRIPTION(
18134 "Call ClearColorImage w/ a depth|stencil image and "
18135 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018136
Tony Barbour1fa09702017-03-16 12:09:08 -060018137 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018138 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018139 if (!depth_format) {
18140 return;
18141 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18143
Tony Barbour552f6c02016-12-21 14:34:07 -070018144 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018145
18146 // Color image
18147 VkClearColorValue clear_color;
18148 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18149 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18150 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18151 const int32_t img_width = 32;
18152 const int32_t img_height = 32;
18153 VkImageCreateInfo image_create_info = {};
18154 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18155 image_create_info.pNext = NULL;
18156 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18157 image_create_info.format = color_format;
18158 image_create_info.extent.width = img_width;
18159 image_create_info.extent.height = img_height;
18160 image_create_info.extent.depth = 1;
18161 image_create_info.mipLevels = 1;
18162 image_create_info.arrayLayers = 1;
18163 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18164 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18165 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18166
18167 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018168 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018169
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018170 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018171
18172 // Depth/Stencil image
18173 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018174 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018175 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18176 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018177 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018178 ds_image_create_info.extent.width = 64;
18179 ds_image_create_info.extent.height = 64;
18180 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018181 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 -060018182
18183 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018184 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018185
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018186 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 -060018187
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018189
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018190 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018191 &color_range);
18192
18193 m_errorMonitor->VerifyFound();
18194
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18196 "vkCmdClearColorImage called with "
18197 "image created without "
18198 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018199
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018200 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018201 &color_range);
18202
18203 m_errorMonitor->VerifyFound();
18204
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018205 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18207 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018208
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018209 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18210 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018211
18212 m_errorMonitor->VerifyFound();
18213}
Tobin Ehliscde08892015-09-22 10:11:37 -060018214
Mike Schuchardt35fece12017-03-07 14:40:28 -070018215TEST_F(VkLayerTest, CommandQueueFlags) {
18216 TEST_DESCRIPTION(
18217 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18218 "graphics-only command");
18219
18220 ASSERT_NO_FATAL_FAILURE(Init());
18221
18222 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018223 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018224 printf(" Non-graphics queue family not found; skipped.\n");
18225 return;
18226 } else {
18227 // Create command pool on a non-graphics queue
18228 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18229
18230 // Setup command buffer on pool
18231 VkCommandBufferObj command_buffer(m_device, &command_pool);
18232 command_buffer.BeginCommandBuffer();
18233
18234 // Issue a graphics only command
18235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18236 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18237 command_buffer.SetViewport(0, 1, &viewport);
18238 m_errorMonitor->VerifyFound();
18239 }
18240}
18241
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018242// WSI Enabled Tests
18243//
Chris Forbes09368e42016-10-13 11:59:22 +130018244#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018245TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18246
18247#if defined(VK_USE_PLATFORM_XCB_KHR)
18248 VkSurfaceKHR surface = VK_NULL_HANDLE;
18249
18250 VkResult err;
18251 bool pass;
18252 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18253 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18254 // uint32_t swapchain_image_count = 0;
18255 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18256 // uint32_t image_index = 0;
18257 // VkPresentInfoKHR present_info = {};
18258
Tony Barbour1fa09702017-03-16 12:09:08 -060018259 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018260
18261 // Use the create function from one of the VK_KHR_*_surface extension in
18262 // order to create a surface, testing all known errors in the process,
18263 // before successfully creating a surface:
18264 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18266 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18267 pass = (err != VK_SUCCESS);
18268 ASSERT_TRUE(pass);
18269 m_errorMonitor->VerifyFound();
18270
18271 // Next, try to create a surface with the wrong
18272 // VkXcbSurfaceCreateInfoKHR::sType:
18273 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18274 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18276 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18277 pass = (err != VK_SUCCESS);
18278 ASSERT_TRUE(pass);
18279 m_errorMonitor->VerifyFound();
18280
18281 // Create a native window, and then correctly create a surface:
18282 xcb_connection_t *connection;
18283 xcb_screen_t *screen;
18284 xcb_window_t xcb_window;
18285 xcb_intern_atom_reply_t *atom_wm_delete_window;
18286
18287 const xcb_setup_t *setup;
18288 xcb_screen_iterator_t iter;
18289 int scr;
18290 uint32_t value_mask, value_list[32];
18291 int width = 1;
18292 int height = 1;
18293
18294 connection = xcb_connect(NULL, &scr);
18295 ASSERT_TRUE(connection != NULL);
18296 setup = xcb_get_setup(connection);
18297 iter = xcb_setup_roots_iterator(setup);
18298 while (scr-- > 0)
18299 xcb_screen_next(&iter);
18300 screen = iter.data;
18301
18302 xcb_window = xcb_generate_id(connection);
18303
18304 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18305 value_list[0] = screen->black_pixel;
18306 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18307
18308 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18309 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18310
18311 /* Magic code that will send notification when window is destroyed */
18312 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18313 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18314
18315 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18316 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18317 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18318 free(reply);
18319
18320 xcb_map_window(connection, xcb_window);
18321
18322 // Force the x/y coordinates to 100,100 results are identical in consecutive
18323 // runs
18324 const uint32_t coords[] = { 100, 100 };
18325 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18326
18327 // Finally, try to correctly create a surface:
18328 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18329 xcb_create_info.pNext = NULL;
18330 xcb_create_info.flags = 0;
18331 xcb_create_info.connection = connection;
18332 xcb_create_info.window = xcb_window;
18333 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18334 pass = (err == VK_SUCCESS);
18335 ASSERT_TRUE(pass);
18336
18337 // Check if surface supports presentation:
18338
18339 // 1st, do so without having queried the queue families:
18340 VkBool32 supported = false;
18341 // TODO: Get the following error to come out:
18342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18343 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18344 "function");
18345 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18346 pass = (err != VK_SUCCESS);
18347 // ASSERT_TRUE(pass);
18348 // m_errorMonitor->VerifyFound();
18349
18350 // Next, query a queue family index that's too large:
18351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18352 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18353 pass = (err != VK_SUCCESS);
18354 ASSERT_TRUE(pass);
18355 m_errorMonitor->VerifyFound();
18356
18357 // Finally, do so correctly:
18358 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18359 // SUPPORTED
18360 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18361 pass = (err == VK_SUCCESS);
18362 ASSERT_TRUE(pass);
18363
18364 // Before proceeding, try to create a swapchain without having called
18365 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18366 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18367 swapchain_create_info.pNext = NULL;
18368 swapchain_create_info.flags = 0;
18369 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18370 swapchain_create_info.surface = surface;
18371 swapchain_create_info.imageArrayLayers = 1;
18372 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18373 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18375 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18376 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18377 pass = (err != VK_SUCCESS);
18378 ASSERT_TRUE(pass);
18379 m_errorMonitor->VerifyFound();
18380
18381 // Get the surface capabilities:
18382 VkSurfaceCapabilitiesKHR surface_capabilities;
18383
18384 // Do so correctly (only error logged by this entrypoint is if the
18385 // extension isn't enabled):
18386 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18387 pass = (err == VK_SUCCESS);
18388 ASSERT_TRUE(pass);
18389
18390 // Get the surface formats:
18391 uint32_t surface_format_count;
18392
18393 // First, try without a pointer to surface_format_count:
18394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18395 "specified as NULL");
18396 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18397 pass = (err == VK_SUCCESS);
18398 ASSERT_TRUE(pass);
18399 m_errorMonitor->VerifyFound();
18400
18401 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18402 // correctly done a 1st try (to get the count):
18403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18404 surface_format_count = 0;
18405 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18406 pass = (err == VK_SUCCESS);
18407 ASSERT_TRUE(pass);
18408 m_errorMonitor->VerifyFound();
18409
18410 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18411 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18412 pass = (err == VK_SUCCESS);
18413 ASSERT_TRUE(pass);
18414
18415 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18416 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18417
18418 // Next, do a 2nd try with surface_format_count being set too high:
18419 surface_format_count += 5;
18420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18421 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18422 pass = (err == VK_SUCCESS);
18423 ASSERT_TRUE(pass);
18424 m_errorMonitor->VerifyFound();
18425
18426 // Finally, do a correct 1st and 2nd try:
18427 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18428 pass = (err == VK_SUCCESS);
18429 ASSERT_TRUE(pass);
18430 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18431 pass = (err == VK_SUCCESS);
18432 ASSERT_TRUE(pass);
18433
18434 // Get the surface present modes:
18435 uint32_t surface_present_mode_count;
18436
18437 // First, try without a pointer to surface_format_count:
18438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18439 "specified as NULL");
18440
18441 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18442 pass = (err == VK_SUCCESS);
18443 ASSERT_TRUE(pass);
18444 m_errorMonitor->VerifyFound();
18445
18446 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18447 // correctly done a 1st try (to get the count):
18448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18449 surface_present_mode_count = 0;
18450 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18451 (VkPresentModeKHR *)&surface_present_mode_count);
18452 pass = (err == VK_SUCCESS);
18453 ASSERT_TRUE(pass);
18454 m_errorMonitor->VerifyFound();
18455
18456 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18457 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18458 pass = (err == VK_SUCCESS);
18459 ASSERT_TRUE(pass);
18460
18461 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18462 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18463
18464 // Next, do a 2nd try with surface_format_count being set too high:
18465 surface_present_mode_count += 5;
18466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18467 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18468 pass = (err == VK_SUCCESS);
18469 ASSERT_TRUE(pass);
18470 m_errorMonitor->VerifyFound();
18471
18472 // Finally, do a correct 1st and 2nd try:
18473 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18474 pass = (err == VK_SUCCESS);
18475 ASSERT_TRUE(pass);
18476 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18477 pass = (err == VK_SUCCESS);
18478 ASSERT_TRUE(pass);
18479
18480 // Create a swapchain:
18481
18482 // First, try without a pointer to swapchain_create_info:
18483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18484 "specified as NULL");
18485
18486 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18487 pass = (err != VK_SUCCESS);
18488 ASSERT_TRUE(pass);
18489 m_errorMonitor->VerifyFound();
18490
18491 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18492 // sType:
18493 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18495
18496 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18497 pass = (err != VK_SUCCESS);
18498 ASSERT_TRUE(pass);
18499 m_errorMonitor->VerifyFound();
18500
18501 // Next, call with a NULL swapchain pointer:
18502 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18503 swapchain_create_info.pNext = NULL;
18504 swapchain_create_info.flags = 0;
18505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18506 "specified as NULL");
18507
18508 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18509 pass = (err != VK_SUCCESS);
18510 ASSERT_TRUE(pass);
18511 m_errorMonitor->VerifyFound();
18512
18513 // TODO: Enhance swapchain layer so that
18514 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18515
18516 // Next, call with a queue family index that's too large:
18517 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18518 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18519 swapchain_create_info.queueFamilyIndexCount = 2;
18520 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18522 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18523 pass = (err != VK_SUCCESS);
18524 ASSERT_TRUE(pass);
18525 m_errorMonitor->VerifyFound();
18526
18527 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18528 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18529 swapchain_create_info.queueFamilyIndexCount = 1;
18530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18531 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18532 "pCreateInfo->pQueueFamilyIndices).");
18533 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18534 pass = (err != VK_SUCCESS);
18535 ASSERT_TRUE(pass);
18536 m_errorMonitor->VerifyFound();
18537
18538 // Next, call with an invalid imageSharingMode:
18539 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18540 swapchain_create_info.queueFamilyIndexCount = 1;
18541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18542 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18543 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18544 pass = (err != VK_SUCCESS);
18545 ASSERT_TRUE(pass);
18546 m_errorMonitor->VerifyFound();
18547 // Fix for the future:
18548 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18549 // SUPPORTED
18550 swapchain_create_info.queueFamilyIndexCount = 0;
18551 queueFamilyIndex[0] = 0;
18552 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18553
18554 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18555 // Get the images from a swapchain:
18556 // Acquire an image from a swapchain:
18557 // Present an image to a swapchain:
18558 // Destroy the swapchain:
18559
18560 // TODOs:
18561 //
18562 // - Try destroying the device without first destroying the swapchain
18563 //
18564 // - Try destroying the device without first destroying the surface
18565 //
18566 // - Try destroying the surface without first destroying the swapchain
18567
18568 // Destroy the surface:
18569 vkDestroySurfaceKHR(instance(), surface, NULL);
18570
18571 // Tear down the window:
18572 xcb_destroy_window(connection, xcb_window);
18573 xcb_disconnect(connection);
18574
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018575#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018576 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018577#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018578}
Chris Forbes09368e42016-10-13 11:59:22 +130018579#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018580
18581//
18582// POSITIVE VALIDATION TESTS
18583//
18584// These tests do not expect to encounter ANY validation errors pass only if this is true
18585
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018586TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18587 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018588 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018589 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18590
18591 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18592 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018593 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018594 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18595 command_buffer_allocate_info.commandBufferCount = 1;
18596
18597 VkCommandBuffer secondary_command_buffer;
18598 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18599 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18600 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18601 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18602 command_buffer_inheritance_info.renderPass = m_renderPass;
18603 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18604
18605 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18606 command_buffer_begin_info.flags =
18607 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18608 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18609
18610 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18611 VkClearAttachment color_attachment;
18612 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18613 color_attachment.clearValue.color.float32[0] = 0;
18614 color_attachment.clearValue.color.float32[1] = 0;
18615 color_attachment.clearValue.color.float32[2] = 0;
18616 color_attachment.clearValue.color.float32[3] = 0;
18617 color_attachment.colorAttachment = 0;
18618 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18619 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18620}
18621
Tobin Ehlise0006882016-11-03 10:14:28 -060018622TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018623 TEST_DESCRIPTION(
18624 "Perform an image layout transition in a secondary command buffer followed "
18625 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018626 VkResult err;
18627 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018628 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018629 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018630 if (!depth_format) {
18631 return;
18632 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18634 // Allocate a secondary and primary cmd buffer
18635 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18636 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018637 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018638 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18639 command_buffer_allocate_info.commandBufferCount = 1;
18640
18641 VkCommandBuffer secondary_command_buffer;
18642 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18643 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18644 VkCommandBuffer primary_command_buffer;
18645 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18646 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18647 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18648 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18649 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18650 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18651 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18652
18653 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18654 ASSERT_VK_SUCCESS(err);
18655 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018656 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 -060018657 ASSERT_TRUE(image.initialized());
18658 VkImageMemoryBarrier img_barrier = {};
18659 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18660 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18661 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18662 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18663 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18664 img_barrier.image = image.handle();
18665 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18666 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18667 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18668 img_barrier.subresourceRange.baseArrayLayer = 0;
18669 img_barrier.subresourceRange.baseMipLevel = 0;
18670 img_barrier.subresourceRange.layerCount = 1;
18671 img_barrier.subresourceRange.levelCount = 1;
18672 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18673 0, nullptr, 1, &img_barrier);
18674 err = vkEndCommandBuffer(secondary_command_buffer);
18675 ASSERT_VK_SUCCESS(err);
18676
18677 // Now update primary cmd buffer to execute secondary and transitions image
18678 command_buffer_begin_info.pInheritanceInfo = nullptr;
18679 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18680 ASSERT_VK_SUCCESS(err);
18681 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18682 VkImageMemoryBarrier img_barrier2 = {};
18683 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18684 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18685 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18686 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18687 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18688 img_barrier2.image = image.handle();
18689 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18690 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18691 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18692 img_barrier2.subresourceRange.baseArrayLayer = 0;
18693 img_barrier2.subresourceRange.baseMipLevel = 0;
18694 img_barrier2.subresourceRange.layerCount = 1;
18695 img_barrier2.subresourceRange.levelCount = 1;
18696 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18697 nullptr, 1, &img_barrier2);
18698 err = vkEndCommandBuffer(primary_command_buffer);
18699 ASSERT_VK_SUCCESS(err);
18700 VkSubmitInfo submit_info = {};
18701 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18702 submit_info.commandBufferCount = 1;
18703 submit_info.pCommandBuffers = &primary_command_buffer;
18704 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18705 ASSERT_VK_SUCCESS(err);
18706 m_errorMonitor->VerifyNotFound();
18707 err = vkDeviceWaitIdle(m_device->device());
18708 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018709 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18710 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018711}
18712
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018713// This is a positive test. No failures are expected.
18714TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018715 TEST_DESCRIPTION(
18716 "Ensure that the vkUpdateDescriptorSets validation code "
18717 "is ignoring VkWriteDescriptorSet members that are not "
18718 "related to the descriptor type specified by "
18719 "VkWriteDescriptorSet::descriptorType. Correct "
18720 "validation behavior will result in the test running to "
18721 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018722
18723 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18724
Tony Barbour1fa09702017-03-16 12:09:08 -060018725 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018726
18727 // Image Case
18728 {
18729 m_errorMonitor->ExpectSuccess();
18730
18731 VkImage image;
18732 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18733 const int32_t tex_width = 32;
18734 const int32_t tex_height = 32;
18735 VkImageCreateInfo image_create_info = {};
18736 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18737 image_create_info.pNext = NULL;
18738 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18739 image_create_info.format = tex_format;
18740 image_create_info.extent.width = tex_width;
18741 image_create_info.extent.height = tex_height;
18742 image_create_info.extent.depth = 1;
18743 image_create_info.mipLevels = 1;
18744 image_create_info.arrayLayers = 1;
18745 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18746 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18747 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18748 image_create_info.flags = 0;
18749 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18750 ASSERT_VK_SUCCESS(err);
18751
18752 VkMemoryRequirements memory_reqs;
18753 VkDeviceMemory image_memory;
18754 bool pass;
18755 VkMemoryAllocateInfo memory_info = {};
18756 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18757 memory_info.pNext = NULL;
18758 memory_info.allocationSize = 0;
18759 memory_info.memoryTypeIndex = 0;
18760 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18761 memory_info.allocationSize = memory_reqs.size;
18762 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18763 ASSERT_TRUE(pass);
18764 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18765 ASSERT_VK_SUCCESS(err);
18766 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18767 ASSERT_VK_SUCCESS(err);
18768
18769 VkImageViewCreateInfo image_view_create_info = {};
18770 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18771 image_view_create_info.image = image;
18772 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18773 image_view_create_info.format = tex_format;
18774 image_view_create_info.subresourceRange.layerCount = 1;
18775 image_view_create_info.subresourceRange.baseMipLevel = 0;
18776 image_view_create_info.subresourceRange.levelCount = 1;
18777 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18778
18779 VkImageView view;
18780 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18781 ASSERT_VK_SUCCESS(err);
18782
18783 VkDescriptorPoolSize ds_type_count = {};
18784 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18785 ds_type_count.descriptorCount = 1;
18786
18787 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18788 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18789 ds_pool_ci.pNext = NULL;
18790 ds_pool_ci.maxSets = 1;
18791 ds_pool_ci.poolSizeCount = 1;
18792 ds_pool_ci.pPoolSizes = &ds_type_count;
18793
18794 VkDescriptorPool ds_pool;
18795 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18796 ASSERT_VK_SUCCESS(err);
18797
18798 VkDescriptorSetLayoutBinding dsl_binding = {};
18799 dsl_binding.binding = 0;
18800 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18801 dsl_binding.descriptorCount = 1;
18802 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18803 dsl_binding.pImmutableSamplers = NULL;
18804
18805 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18806 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18807 ds_layout_ci.pNext = NULL;
18808 ds_layout_ci.bindingCount = 1;
18809 ds_layout_ci.pBindings = &dsl_binding;
18810 VkDescriptorSetLayout ds_layout;
18811 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18812 ASSERT_VK_SUCCESS(err);
18813
18814 VkDescriptorSet descriptor_set;
18815 VkDescriptorSetAllocateInfo alloc_info = {};
18816 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18817 alloc_info.descriptorSetCount = 1;
18818 alloc_info.descriptorPool = ds_pool;
18819 alloc_info.pSetLayouts = &ds_layout;
18820 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18821 ASSERT_VK_SUCCESS(err);
18822
18823 VkDescriptorImageInfo image_info = {};
18824 image_info.imageView = view;
18825 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18826
18827 VkWriteDescriptorSet descriptor_write;
18828 memset(&descriptor_write, 0, sizeof(descriptor_write));
18829 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18830 descriptor_write.dstSet = descriptor_set;
18831 descriptor_write.dstBinding = 0;
18832 descriptor_write.descriptorCount = 1;
18833 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18834 descriptor_write.pImageInfo = &image_info;
18835
18836 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18837 // be
18838 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18839 // This will most likely produce a crash if the parameter_validation
18840 // layer
18841 // does not correctly ignore pBufferInfo.
18842 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18843 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18844
18845 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18846
18847 m_errorMonitor->VerifyNotFound();
18848
18849 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18850 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18851 vkDestroyImageView(m_device->device(), view, NULL);
18852 vkDestroyImage(m_device->device(), image, NULL);
18853 vkFreeMemory(m_device->device(), image_memory, NULL);
18854 }
18855
18856 // Buffer Case
18857 {
18858 m_errorMonitor->ExpectSuccess();
18859
18860 VkBuffer buffer;
18861 uint32_t queue_family_index = 0;
18862 VkBufferCreateInfo buffer_create_info = {};
18863 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18864 buffer_create_info.size = 1024;
18865 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18866 buffer_create_info.queueFamilyIndexCount = 1;
18867 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18868
18869 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18870 ASSERT_VK_SUCCESS(err);
18871
18872 VkMemoryRequirements memory_reqs;
18873 VkDeviceMemory buffer_memory;
18874 bool pass;
18875 VkMemoryAllocateInfo memory_info = {};
18876 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18877 memory_info.pNext = NULL;
18878 memory_info.allocationSize = 0;
18879 memory_info.memoryTypeIndex = 0;
18880
18881 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18882 memory_info.allocationSize = memory_reqs.size;
18883 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18884 ASSERT_TRUE(pass);
18885
18886 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18887 ASSERT_VK_SUCCESS(err);
18888 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18889 ASSERT_VK_SUCCESS(err);
18890
18891 VkDescriptorPoolSize ds_type_count = {};
18892 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18893 ds_type_count.descriptorCount = 1;
18894
18895 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18896 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18897 ds_pool_ci.pNext = NULL;
18898 ds_pool_ci.maxSets = 1;
18899 ds_pool_ci.poolSizeCount = 1;
18900 ds_pool_ci.pPoolSizes = &ds_type_count;
18901
18902 VkDescriptorPool ds_pool;
18903 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18904 ASSERT_VK_SUCCESS(err);
18905
18906 VkDescriptorSetLayoutBinding dsl_binding = {};
18907 dsl_binding.binding = 0;
18908 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18909 dsl_binding.descriptorCount = 1;
18910 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18911 dsl_binding.pImmutableSamplers = NULL;
18912
18913 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18914 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18915 ds_layout_ci.pNext = NULL;
18916 ds_layout_ci.bindingCount = 1;
18917 ds_layout_ci.pBindings = &dsl_binding;
18918 VkDescriptorSetLayout ds_layout;
18919 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18920 ASSERT_VK_SUCCESS(err);
18921
18922 VkDescriptorSet descriptor_set;
18923 VkDescriptorSetAllocateInfo alloc_info = {};
18924 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18925 alloc_info.descriptorSetCount = 1;
18926 alloc_info.descriptorPool = ds_pool;
18927 alloc_info.pSetLayouts = &ds_layout;
18928 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18929 ASSERT_VK_SUCCESS(err);
18930
18931 VkDescriptorBufferInfo buffer_info = {};
18932 buffer_info.buffer = buffer;
18933 buffer_info.offset = 0;
18934 buffer_info.range = 1024;
18935
18936 VkWriteDescriptorSet descriptor_write;
18937 memset(&descriptor_write, 0, sizeof(descriptor_write));
18938 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18939 descriptor_write.dstSet = descriptor_set;
18940 descriptor_write.dstBinding = 0;
18941 descriptor_write.descriptorCount = 1;
18942 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18943 descriptor_write.pBufferInfo = &buffer_info;
18944
18945 // Set pImageInfo and pTexelBufferView to invalid values, which should
18946 // be
18947 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18948 // This will most likely produce a crash if the parameter_validation
18949 // layer
18950 // does not correctly ignore pImageInfo.
18951 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18952 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18953
18954 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18955
18956 m_errorMonitor->VerifyNotFound();
18957
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018958 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18959 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18960 vkDestroyBuffer(m_device->device(), buffer, NULL);
18961 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18962 }
18963
18964 // Texel Buffer Case
18965 {
18966 m_errorMonitor->ExpectSuccess();
18967
18968 VkBuffer buffer;
18969 uint32_t queue_family_index = 0;
18970 VkBufferCreateInfo buffer_create_info = {};
18971 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18972 buffer_create_info.size = 1024;
18973 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18974 buffer_create_info.queueFamilyIndexCount = 1;
18975 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18976
18977 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18978 ASSERT_VK_SUCCESS(err);
18979
18980 VkMemoryRequirements memory_reqs;
18981 VkDeviceMemory buffer_memory;
18982 bool pass;
18983 VkMemoryAllocateInfo memory_info = {};
18984 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18985 memory_info.pNext = NULL;
18986 memory_info.allocationSize = 0;
18987 memory_info.memoryTypeIndex = 0;
18988
18989 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18990 memory_info.allocationSize = memory_reqs.size;
18991 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18992 ASSERT_TRUE(pass);
18993
18994 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18995 ASSERT_VK_SUCCESS(err);
18996 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18997 ASSERT_VK_SUCCESS(err);
18998
18999 VkBufferViewCreateInfo buff_view_ci = {};
19000 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
19001 buff_view_ci.buffer = buffer;
19002 buff_view_ci.format = VK_FORMAT_R8_UNORM;
19003 buff_view_ci.range = VK_WHOLE_SIZE;
19004 VkBufferView buffer_view;
19005 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
19006
19007 VkDescriptorPoolSize ds_type_count = {};
19008 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19009 ds_type_count.descriptorCount = 1;
19010
19011 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19012 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19013 ds_pool_ci.pNext = NULL;
19014 ds_pool_ci.maxSets = 1;
19015 ds_pool_ci.poolSizeCount = 1;
19016 ds_pool_ci.pPoolSizes = &ds_type_count;
19017
19018 VkDescriptorPool ds_pool;
19019 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19020 ASSERT_VK_SUCCESS(err);
19021
19022 VkDescriptorSetLayoutBinding dsl_binding = {};
19023 dsl_binding.binding = 0;
19024 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19025 dsl_binding.descriptorCount = 1;
19026 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19027 dsl_binding.pImmutableSamplers = NULL;
19028
19029 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19030 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19031 ds_layout_ci.pNext = NULL;
19032 ds_layout_ci.bindingCount = 1;
19033 ds_layout_ci.pBindings = &dsl_binding;
19034 VkDescriptorSetLayout ds_layout;
19035 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19036 ASSERT_VK_SUCCESS(err);
19037
19038 VkDescriptorSet descriptor_set;
19039 VkDescriptorSetAllocateInfo alloc_info = {};
19040 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19041 alloc_info.descriptorSetCount = 1;
19042 alloc_info.descriptorPool = ds_pool;
19043 alloc_info.pSetLayouts = &ds_layout;
19044 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19045 ASSERT_VK_SUCCESS(err);
19046
19047 VkWriteDescriptorSet descriptor_write;
19048 memset(&descriptor_write, 0, sizeof(descriptor_write));
19049 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19050 descriptor_write.dstSet = descriptor_set;
19051 descriptor_write.dstBinding = 0;
19052 descriptor_write.descriptorCount = 1;
19053 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19054 descriptor_write.pTexelBufferView = &buffer_view;
19055
19056 // Set pImageInfo and pBufferInfo to invalid values, which should be
19057 // ignored for descriptorType ==
19058 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19059 // This will most likely produce a crash if the parameter_validation
19060 // layer
19061 // does not correctly ignore pImageInfo and pBufferInfo.
19062 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19063 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19064
19065 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19066
19067 m_errorMonitor->VerifyNotFound();
19068
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019069 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19070 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19071 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19072 vkDestroyBuffer(m_device->device(), buffer, NULL);
19073 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19074 }
19075}
19076
Tobin Ehlisf7428442016-10-25 07:58:24 -060019077TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19078 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19079
Tony Barbour1fa09702017-03-16 12:09:08 -060019080 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019081 // Create layout where two binding #s are "1"
19082 static const uint32_t NUM_BINDINGS = 3;
19083 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19084 dsl_binding[0].binding = 1;
19085 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19086 dsl_binding[0].descriptorCount = 1;
19087 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19088 dsl_binding[0].pImmutableSamplers = NULL;
19089 dsl_binding[1].binding = 0;
19090 dsl_binding[1].descriptorCount = 1;
19091 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19092 dsl_binding[1].descriptorCount = 1;
19093 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19094 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019095 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019096 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19097 dsl_binding[2].descriptorCount = 1;
19098 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19099 dsl_binding[2].pImmutableSamplers = NULL;
19100
19101 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19102 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19103 ds_layout_ci.pNext = NULL;
19104 ds_layout_ci.bindingCount = NUM_BINDINGS;
19105 ds_layout_ci.pBindings = dsl_binding;
19106 VkDescriptorSetLayout ds_layout;
19107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
19108 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19109 m_errorMonitor->VerifyFound();
19110}
19111
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019112TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019113 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
19114
Tony Barbour1fa09702017-03-16 12:09:08 -060019115 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019116
Tony Barbour552f6c02016-12-21 14:34:07 -070019117 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019118
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019119 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
19120
19121 {
19122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
19123 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
19124 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19125 m_errorMonitor->VerifyFound();
19126 }
19127
19128 {
19129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
19130 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
19131 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19132 m_errorMonitor->VerifyFound();
19133 }
19134
19135 {
19136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19137 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
19138 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19139 m_errorMonitor->VerifyFound();
19140 }
19141
19142 {
19143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19144 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
19145 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19146 m_errorMonitor->VerifyFound();
19147 }
19148
19149 {
19150 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
19151 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
19152 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19153 m_errorMonitor->VerifyFound();
19154 }
19155
19156 {
19157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
19158 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
19159 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19160 m_errorMonitor->VerifyFound();
19161 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019162
19163 {
19164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19165 VkRect2D scissor = {{-1, 0}, {16, 16}};
19166 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19167 m_errorMonitor->VerifyFound();
19168 }
19169
19170 {
19171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19172 VkRect2D scissor = {{0, -2}, {16, 16}};
19173 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19174 m_errorMonitor->VerifyFound();
19175 }
19176
19177 {
19178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
19179 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
19180 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19181 m_errorMonitor->VerifyFound();
19182 }
19183
19184 {
19185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
19186 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
19187 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19188 m_errorMonitor->VerifyFound();
19189 }
19190
Tony Barbour552f6c02016-12-21 14:34:07 -070019191 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019192}
19193
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019194// This is a positive test. No failures are expected.
19195TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
19196 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
19197 VkResult err;
19198
Tony Barbour1fa09702017-03-16 12:09:08 -060019199 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019200 m_errorMonitor->ExpectSuccess();
19201 VkDescriptorPoolSize ds_type_count = {};
19202 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19203 ds_type_count.descriptorCount = 2;
19204
19205 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19206 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19207 ds_pool_ci.pNext = NULL;
19208 ds_pool_ci.maxSets = 1;
19209 ds_pool_ci.poolSizeCount = 1;
19210 ds_pool_ci.pPoolSizes = &ds_type_count;
19211
19212 VkDescriptorPool ds_pool;
19213 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19214 ASSERT_VK_SUCCESS(err);
19215
19216 // Create layout with two uniform buffer descriptors w/ empty binding between them
19217 static const uint32_t NUM_BINDINGS = 3;
19218 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19219 dsl_binding[0].binding = 0;
19220 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19221 dsl_binding[0].descriptorCount = 1;
19222 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
19223 dsl_binding[0].pImmutableSamplers = NULL;
19224 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019225 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019226 dsl_binding[2].binding = 2;
19227 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19228 dsl_binding[2].descriptorCount = 1;
19229 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
19230 dsl_binding[2].pImmutableSamplers = NULL;
19231
19232 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19233 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19234 ds_layout_ci.pNext = NULL;
19235 ds_layout_ci.bindingCount = NUM_BINDINGS;
19236 ds_layout_ci.pBindings = dsl_binding;
19237 VkDescriptorSetLayout ds_layout;
19238 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19239 ASSERT_VK_SUCCESS(err);
19240
19241 VkDescriptorSet descriptor_set = {};
19242 VkDescriptorSetAllocateInfo alloc_info = {};
19243 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19244 alloc_info.descriptorSetCount = 1;
19245 alloc_info.descriptorPool = ds_pool;
19246 alloc_info.pSetLayouts = &ds_layout;
19247 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19248 ASSERT_VK_SUCCESS(err);
19249
19250 // Create a buffer to be used for update
19251 VkBufferCreateInfo buff_ci = {};
19252 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19253 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19254 buff_ci.size = 256;
19255 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19256 VkBuffer buffer;
19257 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19258 ASSERT_VK_SUCCESS(err);
19259 // Have to bind memory to buffer before descriptor update
19260 VkMemoryAllocateInfo mem_alloc = {};
19261 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19262 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019263 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019264 mem_alloc.memoryTypeIndex = 0;
19265
19266 VkMemoryRequirements mem_reqs;
19267 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19268 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19269 if (!pass) {
19270 vkDestroyBuffer(m_device->device(), buffer, NULL);
19271 return;
19272 }
19273
19274 VkDeviceMemory mem;
19275 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19276 ASSERT_VK_SUCCESS(err);
19277 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19278 ASSERT_VK_SUCCESS(err);
19279
19280 // Only update the descriptor at binding 2
19281 VkDescriptorBufferInfo buff_info = {};
19282 buff_info.buffer = buffer;
19283 buff_info.offset = 0;
19284 buff_info.range = VK_WHOLE_SIZE;
19285 VkWriteDescriptorSet descriptor_write = {};
19286 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19287 descriptor_write.dstBinding = 2;
19288 descriptor_write.descriptorCount = 1;
19289 descriptor_write.pTexelBufferView = nullptr;
19290 descriptor_write.pBufferInfo = &buff_info;
19291 descriptor_write.pImageInfo = nullptr;
19292 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19293 descriptor_write.dstSet = descriptor_set;
19294
19295 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19296
19297 m_errorMonitor->VerifyNotFound();
19298 // Cleanup
19299 vkFreeMemory(m_device->device(), mem, NULL);
19300 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19301 vkDestroyBuffer(m_device->device(), buffer, NULL);
19302 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19303}
19304
19305// This is a positive test. No failures are expected.
19306TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19307 VkResult err;
19308 bool pass;
19309
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019310 TEST_DESCRIPTION(
19311 "Create a buffer, allocate memory, bind memory, destroy "
19312 "the buffer, create an image, and bind the same memory to "
19313 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019314
19315 m_errorMonitor->ExpectSuccess();
19316
Tony Barbour1fa09702017-03-16 12:09:08 -060019317 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019318
19319 VkBuffer buffer;
19320 VkImage image;
19321 VkDeviceMemory mem;
19322 VkMemoryRequirements mem_reqs;
19323
19324 VkBufferCreateInfo buf_info = {};
19325 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19326 buf_info.pNext = NULL;
19327 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19328 buf_info.size = 256;
19329 buf_info.queueFamilyIndexCount = 0;
19330 buf_info.pQueueFamilyIndices = NULL;
19331 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19332 buf_info.flags = 0;
19333 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19334 ASSERT_VK_SUCCESS(err);
19335
19336 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19337
19338 VkMemoryAllocateInfo alloc_info = {};
19339 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19340 alloc_info.pNext = NULL;
19341 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019342
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019343 // Ensure memory is big enough for both bindings
19344 alloc_info.allocationSize = 0x10000;
19345
19346 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19347 if (!pass) {
19348 vkDestroyBuffer(m_device->device(), buffer, NULL);
19349 return;
19350 }
19351
19352 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19353 ASSERT_VK_SUCCESS(err);
19354
19355 uint8_t *pData;
19356 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19357 ASSERT_VK_SUCCESS(err);
19358
19359 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19360
19361 vkUnmapMemory(m_device->device(), mem);
19362
19363 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19364 ASSERT_VK_SUCCESS(err);
19365
19366 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19367 // memory. In fact, it was never used by the GPU.
19368 // Just be be sure, wait for idle.
19369 vkDestroyBuffer(m_device->device(), buffer, NULL);
19370 vkDeviceWaitIdle(m_device->device());
19371
Tobin Ehlis6a005702016-12-28 15:25:56 -070019372 // Use optimal as some platforms report linear support but then fail image creation
19373 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19374 VkImageFormatProperties image_format_properties;
19375 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19376 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19377 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019378 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019379 vkFreeMemory(m_device->device(), mem, NULL);
19380 return;
19381 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019382 VkImageCreateInfo image_create_info = {};
19383 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19384 image_create_info.pNext = NULL;
19385 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19386 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19387 image_create_info.extent.width = 64;
19388 image_create_info.extent.height = 64;
19389 image_create_info.extent.depth = 1;
19390 image_create_info.mipLevels = 1;
19391 image_create_info.arrayLayers = 1;
19392 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019393 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019394 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19395 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19396 image_create_info.queueFamilyIndexCount = 0;
19397 image_create_info.pQueueFamilyIndices = NULL;
19398 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19399 image_create_info.flags = 0;
19400
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019401 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019402 * to be textures or it will be the staging image if they are not.
19403 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019404 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19405 ASSERT_VK_SUCCESS(err);
19406
19407 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19408
Tobin Ehlis6a005702016-12-28 15:25:56 -070019409 VkMemoryAllocateInfo mem_alloc = {};
19410 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19411 mem_alloc.pNext = NULL;
19412 mem_alloc.allocationSize = 0;
19413 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019414 mem_alloc.allocationSize = mem_reqs.size;
19415
19416 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19417 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019418 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019419 vkDestroyImage(m_device->device(), image, NULL);
19420 return;
19421 }
19422
19423 // VALIDATION FAILURE:
19424 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19425 ASSERT_VK_SUCCESS(err);
19426
19427 m_errorMonitor->VerifyNotFound();
19428
19429 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019430 vkDestroyImage(m_device->device(), image, NULL);
19431}
19432
Tony Barbourab713912017-02-02 14:17:35 -070019433// This is a positive test. No failures are expected.
19434TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19435 VkResult err;
19436
19437 TEST_DESCRIPTION(
19438 "Call all applicable destroy and free routines with NULL"
19439 "handles, expecting no validation errors");
19440
19441 m_errorMonitor->ExpectSuccess();
19442
Tony Barbour1fa09702017-03-16 12:09:08 -060019443 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019444 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19445 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19446 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19447 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19448 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19449 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19450 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19451 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19452 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19453 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19454 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19455 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19456 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19457 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19458 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19459 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19460 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19461 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19462 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19463 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19464
19465 VkCommandPool command_pool;
19466 VkCommandPoolCreateInfo pool_create_info{};
19467 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19468 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19469 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19470 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19471 VkCommandBuffer command_buffers[3] = {};
19472 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19473 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19474 command_buffer_allocate_info.commandPool = command_pool;
19475 command_buffer_allocate_info.commandBufferCount = 1;
19476 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19477 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19478 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19479 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19480
19481 VkDescriptorPoolSize ds_type_count = {};
19482 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19483 ds_type_count.descriptorCount = 1;
19484
19485 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19486 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19487 ds_pool_ci.pNext = NULL;
19488 ds_pool_ci.maxSets = 1;
19489 ds_pool_ci.poolSizeCount = 1;
19490 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19491 ds_pool_ci.pPoolSizes = &ds_type_count;
19492
19493 VkDescriptorPool ds_pool;
19494 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19495 ASSERT_VK_SUCCESS(err);
19496
19497 VkDescriptorSetLayoutBinding dsl_binding = {};
19498 dsl_binding.binding = 2;
19499 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19500 dsl_binding.descriptorCount = 1;
19501 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19502 dsl_binding.pImmutableSamplers = NULL;
19503 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19504 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19505 ds_layout_ci.pNext = NULL;
19506 ds_layout_ci.bindingCount = 1;
19507 ds_layout_ci.pBindings = &dsl_binding;
19508 VkDescriptorSetLayout ds_layout;
19509 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19510 ASSERT_VK_SUCCESS(err);
19511
19512 VkDescriptorSet descriptor_sets[3] = {};
19513 VkDescriptorSetAllocateInfo alloc_info = {};
19514 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19515 alloc_info.descriptorSetCount = 1;
19516 alloc_info.descriptorPool = ds_pool;
19517 alloc_info.pSetLayouts = &ds_layout;
19518 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19519 ASSERT_VK_SUCCESS(err);
19520 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19521 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19522 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19523
19524 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19525
19526 m_errorMonitor->VerifyNotFound();
19527}
19528
Tony Barbour626994c2017-02-08 15:29:37 -070019529TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019530 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019531
19532 m_errorMonitor->ExpectSuccess();
19533
Tony Barbour1fa09702017-03-16 12:09:08 -060019534 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019535 VkCommandBuffer cmd_bufs[4];
19536 VkCommandBufferAllocateInfo alloc_info;
19537 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19538 alloc_info.pNext = NULL;
19539 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019540 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019541 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19542 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19543 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019544 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070019545 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19546 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019547 ASSERT_TRUE(image.initialized());
19548 VkCommandBufferBeginInfo cb_binfo;
19549 cb_binfo.pNext = NULL;
19550 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19551 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19552 cb_binfo.flags = 0;
19553 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19554 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19555 VkImageMemoryBarrier img_barrier = {};
19556 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19557 img_barrier.pNext = NULL;
19558 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19559 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19560 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19561 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19562 img_barrier.image = image.handle();
19563 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19564 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19565 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19566 img_barrier.subresourceRange.baseArrayLayer = 0;
19567 img_barrier.subresourceRange.baseMipLevel = 0;
19568 img_barrier.subresourceRange.layerCount = 1;
19569 img_barrier.subresourceRange.levelCount = 1;
19570 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19571 &img_barrier);
19572 vkEndCommandBuffer(cmd_bufs[0]);
19573 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19574 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19575 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19576 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19577 &img_barrier);
19578 vkEndCommandBuffer(cmd_bufs[1]);
19579 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19580 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19581 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19582 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19583 &img_barrier);
19584 vkEndCommandBuffer(cmd_bufs[2]);
19585 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19586 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19587 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19588 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19589 &img_barrier);
19590 vkEndCommandBuffer(cmd_bufs[3]);
19591
19592 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19593 VkSemaphore semaphore1, semaphore2;
19594 VkSemaphoreCreateInfo semaphore_create_info{};
19595 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19596 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19597 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19598 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19599 VkSubmitInfo submit_info[3];
19600 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19601 submit_info[0].pNext = nullptr;
19602 submit_info[0].commandBufferCount = 1;
19603 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19604 submit_info[0].signalSemaphoreCount = 1;
19605 submit_info[0].pSignalSemaphores = &semaphore1;
19606 submit_info[0].waitSemaphoreCount = 0;
19607 submit_info[0].pWaitDstStageMask = nullptr;
19608 submit_info[0].pWaitDstStageMask = flags;
19609 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19610 submit_info[1].pNext = nullptr;
19611 submit_info[1].commandBufferCount = 1;
19612 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19613 submit_info[1].waitSemaphoreCount = 1;
19614 submit_info[1].pWaitSemaphores = &semaphore1;
19615 submit_info[1].signalSemaphoreCount = 1;
19616 submit_info[1].pSignalSemaphores = &semaphore2;
19617 submit_info[1].pWaitDstStageMask = flags;
19618 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19619 submit_info[2].pNext = nullptr;
19620 submit_info[2].commandBufferCount = 2;
19621 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19622 submit_info[2].waitSemaphoreCount = 1;
19623 submit_info[2].pWaitSemaphores = &semaphore2;
19624 submit_info[2].signalSemaphoreCount = 0;
19625 submit_info[2].pSignalSemaphores = nullptr;
19626 submit_info[2].pWaitDstStageMask = flags;
19627 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19628 vkQueueWaitIdle(m_device->m_queue);
19629
19630 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19631 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19632 m_errorMonitor->VerifyNotFound();
19633}
19634
Tobin Ehlis953e8392016-11-17 10:54:13 -070019635TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19636 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19637 // We previously had a bug where dynamic offset of inactive bindings was still being used
19638 VkResult err;
19639 m_errorMonitor->ExpectSuccess();
19640
Tony Barbour1fa09702017-03-16 12:09:08 -060019641 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019642 ASSERT_NO_FATAL_FAILURE(InitViewport());
19643 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19644
19645 VkDescriptorPoolSize ds_type_count = {};
19646 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19647 ds_type_count.descriptorCount = 3;
19648
19649 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19650 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19651 ds_pool_ci.pNext = NULL;
19652 ds_pool_ci.maxSets = 1;
19653 ds_pool_ci.poolSizeCount = 1;
19654 ds_pool_ci.pPoolSizes = &ds_type_count;
19655
19656 VkDescriptorPool ds_pool;
19657 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19658 ASSERT_VK_SUCCESS(err);
19659
19660 const uint32_t BINDING_COUNT = 3;
19661 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019662 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019663 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19664 dsl_binding[0].descriptorCount = 1;
19665 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19666 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019667 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019668 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19669 dsl_binding[1].descriptorCount = 1;
19670 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19671 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019672 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019673 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19674 dsl_binding[2].descriptorCount = 1;
19675 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19676 dsl_binding[2].pImmutableSamplers = NULL;
19677
19678 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19679 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19680 ds_layout_ci.pNext = NULL;
19681 ds_layout_ci.bindingCount = BINDING_COUNT;
19682 ds_layout_ci.pBindings = dsl_binding;
19683 VkDescriptorSetLayout ds_layout;
19684 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19685 ASSERT_VK_SUCCESS(err);
19686
19687 VkDescriptorSet descriptor_set;
19688 VkDescriptorSetAllocateInfo alloc_info = {};
19689 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19690 alloc_info.descriptorSetCount = 1;
19691 alloc_info.descriptorPool = ds_pool;
19692 alloc_info.pSetLayouts = &ds_layout;
19693 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19694 ASSERT_VK_SUCCESS(err);
19695
19696 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19697 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19698 pipeline_layout_ci.pNext = NULL;
19699 pipeline_layout_ci.setLayoutCount = 1;
19700 pipeline_layout_ci.pSetLayouts = &ds_layout;
19701
19702 VkPipelineLayout pipeline_layout;
19703 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19704 ASSERT_VK_SUCCESS(err);
19705
19706 // Create two buffers to update the descriptors with
19707 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19708 uint32_t qfi = 0;
19709 VkBufferCreateInfo buffCI = {};
19710 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19711 buffCI.size = 2048;
19712 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19713 buffCI.queueFamilyIndexCount = 1;
19714 buffCI.pQueueFamilyIndices = &qfi;
19715
19716 VkBuffer dyub1;
19717 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19718 ASSERT_VK_SUCCESS(err);
19719 // buffer2
19720 buffCI.size = 1024;
19721 VkBuffer dyub2;
19722 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19723 ASSERT_VK_SUCCESS(err);
19724 // Allocate memory and bind to buffers
19725 VkMemoryAllocateInfo mem_alloc[2] = {};
19726 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19727 mem_alloc[0].pNext = NULL;
19728 mem_alloc[0].memoryTypeIndex = 0;
19729 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19730 mem_alloc[1].pNext = NULL;
19731 mem_alloc[1].memoryTypeIndex = 0;
19732
19733 VkMemoryRequirements mem_reqs1;
19734 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19735 VkMemoryRequirements mem_reqs2;
19736 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19737 mem_alloc[0].allocationSize = mem_reqs1.size;
19738 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19739 mem_alloc[1].allocationSize = mem_reqs2.size;
19740 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19741 if (!pass) {
19742 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19743 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19744 return;
19745 }
19746
19747 VkDeviceMemory mem1;
19748 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19749 ASSERT_VK_SUCCESS(err);
19750 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19751 ASSERT_VK_SUCCESS(err);
19752 VkDeviceMemory mem2;
19753 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19754 ASSERT_VK_SUCCESS(err);
19755 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19756 ASSERT_VK_SUCCESS(err);
19757 // Update descriptors
19758 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19759 buff_info[0].buffer = dyub1;
19760 buff_info[0].offset = 0;
19761 buff_info[0].range = 256;
19762 buff_info[1].buffer = dyub1;
19763 buff_info[1].offset = 256;
19764 buff_info[1].range = 512;
19765 buff_info[2].buffer = dyub2;
19766 buff_info[2].offset = 0;
19767 buff_info[2].range = 512;
19768
19769 VkWriteDescriptorSet descriptor_write;
19770 memset(&descriptor_write, 0, sizeof(descriptor_write));
19771 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19772 descriptor_write.dstSet = descriptor_set;
19773 descriptor_write.dstBinding = 0;
19774 descriptor_write.descriptorCount = BINDING_COUNT;
19775 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19776 descriptor_write.pBufferInfo = buff_info;
19777
19778 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19779
Tony Barbour552f6c02016-12-21 14:34:07 -070019780 m_commandBuffer->BeginCommandBuffer();
19781 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019782
19783 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019784 char const *vsSource =
19785 "#version 450\n"
19786 "\n"
19787 "out gl_PerVertex { \n"
19788 " vec4 gl_Position;\n"
19789 "};\n"
19790 "void main(){\n"
19791 " gl_Position = vec4(1);\n"
19792 "}\n";
19793 char const *fsSource =
19794 "#version 450\n"
19795 "\n"
19796 "layout(location=0) out vec4 x;\n"
19797 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19798 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19799 "void main(){\n"
19800 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19801 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019802 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19803 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19804 VkPipelineObj pipe(m_device);
19805 pipe.SetViewport(m_viewports);
19806 pipe.SetScissor(m_scissors);
19807 pipe.AddShader(&vs);
19808 pipe.AddShader(&fs);
19809 pipe.AddColorAttachment();
19810 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19811
19812 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19813 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19814 // we used to have a bug in this case.
19815 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19816 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19817 &descriptor_set, BINDING_COUNT, dyn_off);
19818 Draw(1, 0, 0, 0);
19819 m_errorMonitor->VerifyNotFound();
19820
19821 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19822 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19823 vkFreeMemory(m_device->device(), mem1, NULL);
19824 vkFreeMemory(m_device->device(), mem2, NULL);
19825
19826 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19827 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19828 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19829}
19830
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019831TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019832 TEST_DESCRIPTION(
19833 "Ensure that validations handling of non-coherent memory "
19834 "mapping while using VK_WHOLE_SIZE does not cause access "
19835 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019836 VkResult err;
19837 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019838 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019839
19840 VkDeviceMemory mem;
19841 VkMemoryRequirements mem_reqs;
19842 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019843 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019844 VkMemoryAllocateInfo alloc_info = {};
19845 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19846 alloc_info.pNext = NULL;
19847 alloc_info.memoryTypeIndex = 0;
19848
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019849 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019850 alloc_info.allocationSize = allocation_size;
19851
19852 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19853 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 -070019854 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019855 if (!pass) {
19856 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019857 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19858 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019859 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019860 pass = m_device->phy().set_memory_type(
19861 mem_reqs.memoryTypeBits, &alloc_info,
19862 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19863 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019864 if (!pass) {
19865 return;
19866 }
19867 }
19868 }
19869
19870 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19871 ASSERT_VK_SUCCESS(err);
19872
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019873 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019874 m_errorMonitor->ExpectSuccess();
19875 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19876 ASSERT_VK_SUCCESS(err);
19877 VkMappedMemoryRange mmr = {};
19878 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19879 mmr.memory = mem;
19880 mmr.offset = 0;
19881 mmr.size = VK_WHOLE_SIZE;
19882 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19883 ASSERT_VK_SUCCESS(err);
19884 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19885 ASSERT_VK_SUCCESS(err);
19886 m_errorMonitor->VerifyNotFound();
19887 vkUnmapMemory(m_device->device(), mem);
19888
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019889 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019890 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019891 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019892 ASSERT_VK_SUCCESS(err);
19893 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19894 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019895 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019896 mmr.size = VK_WHOLE_SIZE;
19897 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19898 ASSERT_VK_SUCCESS(err);
19899 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19900 ASSERT_VK_SUCCESS(err);
19901 m_errorMonitor->VerifyNotFound();
19902 vkUnmapMemory(m_device->device(), mem);
19903
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019904 // Map with offset and size
19905 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019906 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019907 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019908 ASSERT_VK_SUCCESS(err);
19909 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19910 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019911 mmr.offset = 4 * atom_size;
19912 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019913 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19914 ASSERT_VK_SUCCESS(err);
19915 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19916 ASSERT_VK_SUCCESS(err);
19917 m_errorMonitor->VerifyNotFound();
19918 vkUnmapMemory(m_device->device(), mem);
19919
19920 // Map without offset and flush WHOLE_SIZE with two separate offsets
19921 m_errorMonitor->ExpectSuccess();
19922 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19923 ASSERT_VK_SUCCESS(err);
19924 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19925 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019926 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019927 mmr.size = VK_WHOLE_SIZE;
19928 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19929 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019930 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019931 mmr.size = VK_WHOLE_SIZE;
19932 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19933 ASSERT_VK_SUCCESS(err);
19934 m_errorMonitor->VerifyNotFound();
19935 vkUnmapMemory(m_device->device(), mem);
19936
19937 vkFreeMemory(m_device->device(), mem, NULL);
19938}
19939
19940// This is a positive test. We used to expect error in this case but spec now allows it
19941TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19942 m_errorMonitor->ExpectSuccess();
19943 vk_testing::Fence testFence;
19944 VkFenceCreateInfo fenceInfo = {};
19945 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19946 fenceInfo.pNext = NULL;
19947
Tony Barbour1fa09702017-03-16 12:09:08 -060019948 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019949 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019950 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019951 VkResult result = vkResetFences(m_device->device(), 1, fences);
19952 ASSERT_VK_SUCCESS(result);
19953
19954 m_errorMonitor->VerifyNotFound();
19955}
19956
19957TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19958 m_errorMonitor->ExpectSuccess();
19959
Tony Barbour1fa09702017-03-16 12:09:08 -060019960 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019961 VkResult err;
19962
19963 // Record (empty!) command buffer that can be submitted multiple times
19964 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019965 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19966 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019967 m_commandBuffer->BeginCommandBuffer(&cbbi);
19968 m_commandBuffer->EndCommandBuffer();
19969
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019970 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019971 VkFence fence;
19972 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19973 ASSERT_VK_SUCCESS(err);
19974
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019975 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019976 VkSemaphore s1, s2;
19977 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19978 ASSERT_VK_SUCCESS(err);
19979 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19980 ASSERT_VK_SUCCESS(err);
19981
19982 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019983 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019984 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19985 ASSERT_VK_SUCCESS(err);
19986
19987 // Submit CB again, signaling s2.
19988 si.pSignalSemaphores = &s2;
19989 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19990 ASSERT_VK_SUCCESS(err);
19991
19992 // Wait for fence.
19993 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19994 ASSERT_VK_SUCCESS(err);
19995
19996 // CB is still in flight from second submission, but semaphore s1 is no
19997 // longer in flight. delete it.
19998 vkDestroySemaphore(m_device->device(), s1, nullptr);
19999
20000 m_errorMonitor->VerifyNotFound();
20001
20002 // Force device idle and clean up remaining objects
20003 vkDeviceWaitIdle(m_device->device());
20004 vkDestroySemaphore(m_device->device(), s2, nullptr);
20005 vkDestroyFence(m_device->device(), fence, nullptr);
20006}
20007
20008TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
20009 m_errorMonitor->ExpectSuccess();
20010
Tony Barbour1fa09702017-03-16 12:09:08 -060020011 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020012 VkResult err;
20013
20014 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020015 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020016 VkFence f1;
20017 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20018 ASSERT_VK_SUCCESS(err);
20019
20020 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020021 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020022 VkFence f2;
20023 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20024 ASSERT_VK_SUCCESS(err);
20025
20026 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020027 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020028 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20029
20030 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020031 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020032 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20033
20034 // Should have both retired!
20035 vkDestroyFence(m_device->device(), f1, nullptr);
20036 vkDestroyFence(m_device->device(), f2, nullptr);
20037
20038 m_errorMonitor->VerifyNotFound();
20039}
20040
20041TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020042 TEST_DESCRIPTION(
20043 "Verify that creating an image view from an image with valid usage "
20044 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020045
Tony Barbour1fa09702017-03-16 12:09:08 -060020046 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020047
20048 m_errorMonitor->ExpectSuccess();
20049 // Verify that we can create a view with usage INPUT_ATTACHMENT
20050 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020051 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 -060020052 ASSERT_TRUE(image.initialized());
20053 VkImageView imageView;
20054 VkImageViewCreateInfo ivci = {};
20055 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20056 ivci.image = image.handle();
20057 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20058 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20059 ivci.subresourceRange.layerCount = 1;
20060 ivci.subresourceRange.baseMipLevel = 0;
20061 ivci.subresourceRange.levelCount = 1;
20062 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20063
20064 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20065 m_errorMonitor->VerifyNotFound();
20066 vkDestroyImageView(m_device->device(), imageView, NULL);
20067}
20068
20069// This is a positive test. No failures are expected.
20070TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020071 TEST_DESCRIPTION(
20072 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20073 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020074
Tony Barbour1fa09702017-03-16 12:09:08 -060020075 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020076
20077 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020078 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020079 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020080
20081 m_errorMonitor->ExpectSuccess();
20082
20083 VkImage image;
20084 VkImageCreateInfo image_create_info = {};
20085 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20086 image_create_info.pNext = NULL;
20087 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20088 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20089 image_create_info.extent.width = 64;
20090 image_create_info.extent.height = 64;
20091 image_create_info.extent.depth = 1;
20092 image_create_info.mipLevels = 1;
20093 image_create_info.arrayLayers = 1;
20094 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20095 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20096 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20097 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20098 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20099 ASSERT_VK_SUCCESS(err);
20100
20101 VkMemoryRequirements memory_reqs;
20102 VkDeviceMemory memory_one, memory_two;
20103 bool pass;
20104 VkMemoryAllocateInfo memory_info = {};
20105 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20106 memory_info.pNext = NULL;
20107 memory_info.allocationSize = 0;
20108 memory_info.memoryTypeIndex = 0;
20109 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20110 // Find an image big enough to allow sparse mapping of 2 memory regions
20111 // Increase the image size until it is at least twice the
20112 // size of the required alignment, to ensure we can bind both
20113 // allocated memory blocks to the image on aligned offsets.
20114 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
20115 vkDestroyImage(m_device->device(), image, nullptr);
20116 image_create_info.extent.width *= 2;
20117 image_create_info.extent.height *= 2;
20118 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
20119 ASSERT_VK_SUCCESS(err);
20120 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20121 }
20122 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
20123 // at the end of the first
20124 memory_info.allocationSize = memory_reqs.alignment;
20125 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20126 ASSERT_TRUE(pass);
20127 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
20128 ASSERT_VK_SUCCESS(err);
20129 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
20130 ASSERT_VK_SUCCESS(err);
20131 VkSparseMemoryBind binds[2];
20132 binds[0].flags = 0;
20133 binds[0].memory = memory_one;
20134 binds[0].memoryOffset = 0;
20135 binds[0].resourceOffset = 0;
20136 binds[0].size = memory_info.allocationSize;
20137 binds[1].flags = 0;
20138 binds[1].memory = memory_two;
20139 binds[1].memoryOffset = 0;
20140 binds[1].resourceOffset = memory_info.allocationSize;
20141 binds[1].size = memory_info.allocationSize;
20142
20143 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
20144 opaqueBindInfo.image = image;
20145 opaqueBindInfo.bindCount = 2;
20146 opaqueBindInfo.pBinds = binds;
20147
20148 VkFence fence = VK_NULL_HANDLE;
20149 VkBindSparseInfo bindSparseInfo = {};
20150 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
20151 bindSparseInfo.imageOpaqueBindCount = 1;
20152 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
20153
20154 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
20155 vkQueueWaitIdle(m_device->m_queue);
20156 vkDestroyImage(m_device->device(), image, NULL);
20157 vkFreeMemory(m_device->device(), memory_one, NULL);
20158 vkFreeMemory(m_device->device(), memory_two, NULL);
20159 m_errorMonitor->VerifyNotFound();
20160}
20161
20162TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020163 TEST_DESCRIPTION(
20164 "Ensure that CmdBeginRenderPass with an attachment's "
20165 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
20166 "the command buffer has prior knowledge of that "
20167 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020168
20169 m_errorMonitor->ExpectSuccess();
20170
Tony Barbour1fa09702017-03-16 12:09:08 -060020171 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020172
20173 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020174 VkAttachmentDescription attachment = {0,
20175 VK_FORMAT_R8G8B8A8_UNORM,
20176 VK_SAMPLE_COUNT_1_BIT,
20177 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20178 VK_ATTACHMENT_STORE_OP_STORE,
20179 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20180 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20181 VK_IMAGE_LAYOUT_UNDEFINED,
20182 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020183
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020184 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020185
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020186 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020187
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020188 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020189
20190 VkRenderPass rp;
20191 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20192 ASSERT_VK_SUCCESS(err);
20193
20194 // A compatible framebuffer.
20195 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020196 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 -060020197 ASSERT_TRUE(image.initialized());
20198
20199 VkImageViewCreateInfo ivci = {
20200 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20201 nullptr,
20202 0,
20203 image.handle(),
20204 VK_IMAGE_VIEW_TYPE_2D,
20205 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020206 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20207 VK_COMPONENT_SWIZZLE_IDENTITY},
20208 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020209 };
20210 VkImageView view;
20211 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20212 ASSERT_VK_SUCCESS(err);
20213
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020214 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020215 VkFramebuffer fb;
20216 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20217 ASSERT_VK_SUCCESS(err);
20218
20219 // Record a single command buffer which uses this renderpass twice. The
20220 // bug is triggered at the beginning of the second renderpass, when the
20221 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020222 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 -070020223 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020224 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20225 vkCmdEndRenderPass(m_commandBuffer->handle());
20226 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20227
20228 m_errorMonitor->VerifyNotFound();
20229
20230 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020231 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020232
20233 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20234 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20235 vkDestroyImageView(m_device->device(), view, nullptr);
20236}
20237
20238TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020239 TEST_DESCRIPTION(
20240 "This test should pass. Create a Framebuffer and "
20241 "command buffer, bind them together, then destroy "
20242 "command pool and framebuffer and verify there are no "
20243 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020244
20245 m_errorMonitor->ExpectSuccess();
20246
Tony Barbour1fa09702017-03-16 12:09:08 -060020247 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020248
20249 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020250 VkAttachmentDescription attachment = {0,
20251 VK_FORMAT_R8G8B8A8_UNORM,
20252 VK_SAMPLE_COUNT_1_BIT,
20253 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20254 VK_ATTACHMENT_STORE_OP_STORE,
20255 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20256 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20257 VK_IMAGE_LAYOUT_UNDEFINED,
20258 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020259
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020260 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020261
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020262 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020263
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020264 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020265
20266 VkRenderPass rp;
20267 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20268 ASSERT_VK_SUCCESS(err);
20269
20270 // A compatible framebuffer.
20271 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020272 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 -060020273 ASSERT_TRUE(image.initialized());
20274
20275 VkImageViewCreateInfo ivci = {
20276 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20277 nullptr,
20278 0,
20279 image.handle(),
20280 VK_IMAGE_VIEW_TYPE_2D,
20281 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020282 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20283 VK_COMPONENT_SWIZZLE_IDENTITY},
20284 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020285 };
20286 VkImageView view;
20287 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20288 ASSERT_VK_SUCCESS(err);
20289
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020290 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020291 VkFramebuffer fb;
20292 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20293 ASSERT_VK_SUCCESS(err);
20294
20295 // Explicitly create a command buffer to bind the FB to so that we can then
20296 // destroy the command pool in order to implicitly free command buffer
20297 VkCommandPool command_pool;
20298 VkCommandPoolCreateInfo pool_create_info{};
20299 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20300 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20301 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20302 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20303
20304 VkCommandBuffer command_buffer;
20305 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20306 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20307 command_buffer_allocate_info.commandPool = command_pool;
20308 command_buffer_allocate_info.commandBufferCount = 1;
20309 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20310 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20311
20312 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020313 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 -060020314 VkCommandBufferBeginInfo begin_info{};
20315 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20316 vkBeginCommandBuffer(command_buffer, &begin_info);
20317
20318 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20319 vkCmdEndRenderPass(command_buffer);
20320 vkEndCommandBuffer(command_buffer);
20321 vkDestroyImageView(m_device->device(), view, nullptr);
20322 // Destroy command pool to implicitly free command buffer
20323 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20324 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20325 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20326 m_errorMonitor->VerifyNotFound();
20327}
20328
20329TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020330 TEST_DESCRIPTION(
20331 "Ensure that CmdBeginRenderPass applies the layout "
20332 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020333
20334 m_errorMonitor->ExpectSuccess();
20335
Tony Barbour1fa09702017-03-16 12:09:08 -060020336 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020337
20338 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020339 VkAttachmentDescription attachment = {0,
20340 VK_FORMAT_R8G8B8A8_UNORM,
20341 VK_SAMPLE_COUNT_1_BIT,
20342 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20343 VK_ATTACHMENT_STORE_OP_STORE,
20344 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20345 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20346 VK_IMAGE_LAYOUT_UNDEFINED,
20347 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020348
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020349 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020350
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020351 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020352
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020353 VkSubpassDependency dep = {0,
20354 0,
20355 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20356 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20357 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20358 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20359 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020360
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020361 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020362
20363 VkResult err;
20364 VkRenderPass rp;
20365 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20366 ASSERT_VK_SUCCESS(err);
20367
20368 // A compatible framebuffer.
20369 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020370 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 -060020371 ASSERT_TRUE(image.initialized());
20372
20373 VkImageViewCreateInfo ivci = {
20374 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20375 nullptr,
20376 0,
20377 image.handle(),
20378 VK_IMAGE_VIEW_TYPE_2D,
20379 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020380 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20381 VK_COMPONENT_SWIZZLE_IDENTITY},
20382 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020383 };
20384 VkImageView view;
20385 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20386 ASSERT_VK_SUCCESS(err);
20387
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020388 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020389 VkFramebuffer fb;
20390 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20391 ASSERT_VK_SUCCESS(err);
20392
20393 // Record a single command buffer which issues a pipeline barrier w/
20394 // image memory barrier for the attachment. This detects the previously
20395 // missing tracking of the subpass layout by throwing a validation error
20396 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020397 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 -070020398 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020399 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20400
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020401 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20402 nullptr,
20403 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20404 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20405 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20406 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20407 VK_QUEUE_FAMILY_IGNORED,
20408 VK_QUEUE_FAMILY_IGNORED,
20409 image.handle(),
20410 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020411 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020412 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20413 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020414
20415 vkCmdEndRenderPass(m_commandBuffer->handle());
20416 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020417 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020418
20419 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20420 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20421 vkDestroyImageView(m_device->device(), view, nullptr);
20422}
20423
20424TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020425 TEST_DESCRIPTION(
20426 "Validate that when an imageView of a depth/stencil image "
20427 "is used as a depth/stencil framebuffer attachment, the "
20428 "aspectMask is ignored and both depth and stencil image "
20429 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020430
Tony Barbour1fa09702017-03-16 12:09:08 -060020431 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020432 VkFormatProperties format_properties;
20433 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20434 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20435 return;
20436 }
20437
20438 m_errorMonitor->ExpectSuccess();
20439
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020440 VkAttachmentDescription attachment = {0,
20441 VK_FORMAT_D32_SFLOAT_S8_UINT,
20442 VK_SAMPLE_COUNT_1_BIT,
20443 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20444 VK_ATTACHMENT_STORE_OP_STORE,
20445 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20446 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20447 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20448 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020449
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020450 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020451
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020452 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020453
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020454 VkSubpassDependency dep = {0,
20455 0,
20456 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20457 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20458 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20459 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20460 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020461
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020462 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020463
20464 VkResult err;
20465 VkRenderPass rp;
20466 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20467 ASSERT_VK_SUCCESS(err);
20468
20469 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020470 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
20471 0x26, // usage
20472 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020473 ASSERT_TRUE(image.initialized());
20474 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20475
20476 VkImageViewCreateInfo ivci = {
20477 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20478 nullptr,
20479 0,
20480 image.handle(),
20481 VK_IMAGE_VIEW_TYPE_2D,
20482 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020483 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20484 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020485 };
20486 VkImageView view;
20487 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20488 ASSERT_VK_SUCCESS(err);
20489
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020490 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020491 VkFramebuffer fb;
20492 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20493 ASSERT_VK_SUCCESS(err);
20494
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020495 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 -070020496 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020497 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20498
20499 VkImageMemoryBarrier imb = {};
20500 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20501 imb.pNext = nullptr;
20502 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20503 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20504 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20505 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20506 imb.srcQueueFamilyIndex = 0;
20507 imb.dstQueueFamilyIndex = 0;
20508 imb.image = image.handle();
20509 imb.subresourceRange.aspectMask = 0x6;
20510 imb.subresourceRange.baseMipLevel = 0;
20511 imb.subresourceRange.levelCount = 0x1;
20512 imb.subresourceRange.baseArrayLayer = 0;
20513 imb.subresourceRange.layerCount = 0x1;
20514
20515 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020516 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20517 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020518
20519 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020520 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020521 QueueCommandBuffer(false);
20522 m_errorMonitor->VerifyNotFound();
20523
20524 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20525 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20526 vkDestroyImageView(m_device->device(), view, nullptr);
20527}
20528
20529TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020530 TEST_DESCRIPTION(
20531 "Ensure that layout transitions work correctly without "
20532 "errors, when an attachment reference is "
20533 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020534
20535 m_errorMonitor->ExpectSuccess();
20536
Tony Barbour1fa09702017-03-16 12:09:08 -060020537 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020538
20539 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020540 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020541
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020542 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020543
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020544 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020545
20546 VkRenderPass rp;
20547 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20548 ASSERT_VK_SUCCESS(err);
20549
20550 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020551 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020552 VkFramebuffer fb;
20553 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20554 ASSERT_VK_SUCCESS(err);
20555
20556 // Record a command buffer which just begins and ends the renderpass. The
20557 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020558 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 -070020559 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020560 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20561 vkCmdEndRenderPass(m_commandBuffer->handle());
20562 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020563 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020564
20565 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20566 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20567}
20568
20569// This is a positive test. No errors are expected.
20570TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020571 TEST_DESCRIPTION(
20572 "Create a stencil-only attachment with a LOAD_OP set to "
20573 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020574 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020575 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020576 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020577 if (!depth_format) {
20578 printf(" No Depth + Stencil format found. Skipped.\n");
20579 return;
20580 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020581 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020582 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020583 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20584 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020585 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20586 return;
20587 }
20588
Tony Barbourf887b162017-03-09 10:06:46 -070020589 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020590 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020591 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020592 VkAttachmentDescription att = {};
20593 VkAttachmentReference ref = {};
20594 att.format = depth_stencil_fmt;
20595 att.samples = VK_SAMPLE_COUNT_1_BIT;
20596 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20597 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20598 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20599 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20600 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20601 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20602
20603 VkClearValue clear;
20604 clear.depthStencil.depth = 1.0;
20605 clear.depthStencil.stencil = 0;
20606 ref.attachment = 0;
20607 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20608
20609 VkSubpassDescription subpass = {};
20610 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20611 subpass.flags = 0;
20612 subpass.inputAttachmentCount = 0;
20613 subpass.pInputAttachments = NULL;
20614 subpass.colorAttachmentCount = 0;
20615 subpass.pColorAttachments = NULL;
20616 subpass.pResolveAttachments = NULL;
20617 subpass.pDepthStencilAttachment = &ref;
20618 subpass.preserveAttachmentCount = 0;
20619 subpass.pPreserveAttachments = NULL;
20620
20621 VkRenderPass rp;
20622 VkRenderPassCreateInfo rp_info = {};
20623 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20624 rp_info.attachmentCount = 1;
20625 rp_info.pAttachments = &att;
20626 rp_info.subpassCount = 1;
20627 rp_info.pSubpasses = &subpass;
20628 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20629 ASSERT_VK_SUCCESS(result);
20630
20631 VkImageView *depthView = m_depthStencil->BindInfo();
20632 VkFramebufferCreateInfo fb_info = {};
20633 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20634 fb_info.pNext = NULL;
20635 fb_info.renderPass = rp;
20636 fb_info.attachmentCount = 1;
20637 fb_info.pAttachments = depthView;
20638 fb_info.width = 100;
20639 fb_info.height = 100;
20640 fb_info.layers = 1;
20641 VkFramebuffer fb;
20642 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20643 ASSERT_VK_SUCCESS(result);
20644
20645 VkRenderPassBeginInfo rpbinfo = {};
20646 rpbinfo.clearValueCount = 1;
20647 rpbinfo.pClearValues = &clear;
20648 rpbinfo.pNext = NULL;
20649 rpbinfo.renderPass = rp;
20650 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20651 rpbinfo.renderArea.extent.width = 100;
20652 rpbinfo.renderArea.extent.height = 100;
20653 rpbinfo.renderArea.offset.x = 0;
20654 rpbinfo.renderArea.offset.y = 0;
20655 rpbinfo.framebuffer = fb;
20656
20657 VkFence fence = {};
20658 VkFenceCreateInfo fence_ci = {};
20659 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20660 fence_ci.pNext = nullptr;
20661 fence_ci.flags = 0;
20662 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20663 ASSERT_VK_SUCCESS(result);
20664
20665 m_commandBuffer->BeginCommandBuffer();
20666 m_commandBuffer->BeginRenderPass(rpbinfo);
20667 m_commandBuffer->EndRenderPass();
20668 m_commandBuffer->EndCommandBuffer();
20669 m_commandBuffer->QueueCommandBuffer(fence);
20670
20671 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020672 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 -070020673 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020674 VkImageMemoryBarrier barrier = {};
20675 VkImageSubresourceRange range;
20676 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20677 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20678 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20679 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20680 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20681 barrier.image = m_depthStencil->handle();
20682 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20683 range.baseMipLevel = 0;
20684 range.levelCount = 1;
20685 range.baseArrayLayer = 0;
20686 range.layerCount = 1;
20687 barrier.subresourceRange = range;
20688 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20689 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20690 cmdbuf.BeginCommandBuffer();
20691 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 -070020692 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020693 barrier.srcAccessMask = 0;
20694 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20695 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20696 barrier.image = destImage.handle();
20697 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20698 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 -070020699 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020700 VkImageCopy cregion;
20701 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20702 cregion.srcSubresource.mipLevel = 0;
20703 cregion.srcSubresource.baseArrayLayer = 0;
20704 cregion.srcSubresource.layerCount = 1;
20705 cregion.srcOffset.x = 0;
20706 cregion.srcOffset.y = 0;
20707 cregion.srcOffset.z = 0;
20708 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20709 cregion.dstSubresource.mipLevel = 0;
20710 cregion.dstSubresource.baseArrayLayer = 0;
20711 cregion.dstSubresource.layerCount = 1;
20712 cregion.dstOffset.x = 0;
20713 cregion.dstOffset.y = 0;
20714 cregion.dstOffset.z = 0;
20715 cregion.extent.width = 100;
20716 cregion.extent.height = 100;
20717 cregion.extent.depth = 1;
20718 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020719 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020720 cmdbuf.EndCommandBuffer();
20721
20722 VkSubmitInfo submit_info;
20723 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20724 submit_info.pNext = NULL;
20725 submit_info.waitSemaphoreCount = 0;
20726 submit_info.pWaitSemaphores = NULL;
20727 submit_info.pWaitDstStageMask = NULL;
20728 submit_info.commandBufferCount = 1;
20729 submit_info.pCommandBuffers = &cmdbuf.handle();
20730 submit_info.signalSemaphoreCount = 0;
20731 submit_info.pSignalSemaphores = NULL;
20732
20733 m_errorMonitor->ExpectSuccess();
20734 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20735 m_errorMonitor->VerifyNotFound();
20736
20737 vkQueueWaitIdle(m_device->m_queue);
20738 vkDestroyFence(m_device->device(), fence, nullptr);
20739 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20740 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20741}
20742
20743// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020744TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20745 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20746
20747 m_errorMonitor->ExpectSuccess();
20748
Tony Barbour1fa09702017-03-16 12:09:08 -060020749 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020750 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020751 if (!depth_format) {
20752 printf(" No Depth + Stencil format found. Skipped.\n");
20753 return;
20754 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020755 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20756
20757 VkImageMemoryBarrier img_barrier = {};
20758 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20759 img_barrier.pNext = NULL;
20760 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20761 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20762 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20763 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20764 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20765 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20766 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20767 img_barrier.subresourceRange.baseArrayLayer = 0;
20768 img_barrier.subresourceRange.baseMipLevel = 0;
20769 img_barrier.subresourceRange.layerCount = 1;
20770 img_barrier.subresourceRange.levelCount = 1;
20771
20772 {
20773 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020774 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 -070020775 ASSERT_TRUE(img_color.initialized());
20776
20777 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020778 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 -070020779 ASSERT_TRUE(img_ds1.initialized());
20780
20781 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020782 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 -070020783 ASSERT_TRUE(img_ds2.initialized());
20784
20785 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020786 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 -070020787 ASSERT_TRUE(img_xfer_src.initialized());
20788
20789 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020790 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 -070020791 ASSERT_TRUE(img_xfer_dst.initialized());
20792
20793 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020794 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 -070020795 ASSERT_TRUE(img_sampled.initialized());
20796
20797 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020798 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 -070020799 ASSERT_TRUE(img_input.initialized());
20800
20801 const struct {
20802 VkImageObj &image_obj;
20803 VkImageLayout old_layout;
20804 VkImageLayout new_layout;
20805 } buffer_layouts[] = {
20806 // clang-format off
20807 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20808 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20809 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20810 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20811 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20812 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20813 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20814 // clang-format on
20815 };
20816 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20817
20818 m_commandBuffer->BeginCommandBuffer();
20819 for (uint32_t i = 0; i < layout_count; ++i) {
20820 img_barrier.image = buffer_layouts[i].image_obj.handle();
20821 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20822 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20823 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20824 : VK_IMAGE_ASPECT_COLOR_BIT;
20825
20826 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20827 img_barrier.newLayout = buffer_layouts[i].new_layout;
20828 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20829 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20830
20831 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20832 img_barrier.newLayout = buffer_layouts[i].old_layout;
20833 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20834 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20835 }
20836 m_commandBuffer->EndCommandBuffer();
20837
20838 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20839 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20840 }
20841 m_errorMonitor->VerifyNotFound();
20842}
20843
20844// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020845TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20846 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20847
20848 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020849 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020850
20851 VkEvent event;
20852 VkEventCreateInfo event_create_info{};
20853 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20854 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20855
20856 VkCommandPool command_pool;
20857 VkCommandPoolCreateInfo pool_create_info{};
20858 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20859 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20860 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20861 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20862
20863 VkCommandBuffer command_buffer;
20864 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20865 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20866 command_buffer_allocate_info.commandPool = command_pool;
20867 command_buffer_allocate_info.commandBufferCount = 1;
20868 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20869 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20870
20871 VkQueue queue = VK_NULL_HANDLE;
20872 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20873
20874 {
20875 VkCommandBufferBeginInfo begin_info{};
20876 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20877 vkBeginCommandBuffer(command_buffer, &begin_info);
20878
20879 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 -070020880 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020881 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20882 vkEndCommandBuffer(command_buffer);
20883 }
20884 {
20885 VkSubmitInfo submit_info{};
20886 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20887 submit_info.commandBufferCount = 1;
20888 submit_info.pCommandBuffers = &command_buffer;
20889 submit_info.signalSemaphoreCount = 0;
20890 submit_info.pSignalSemaphores = nullptr;
20891 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20892 }
20893 { vkSetEvent(m_device->device(), event); }
20894
20895 vkQueueWaitIdle(queue);
20896
20897 vkDestroyEvent(m_device->device(), event, nullptr);
20898 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20899 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20900
20901 m_errorMonitor->VerifyNotFound();
20902}
20903// This is a positive test. No errors should be generated.
20904TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20905 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20906
Tony Barbour1fa09702017-03-16 12:09:08 -060020907 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020908 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020909
20910 m_errorMonitor->ExpectSuccess();
20911
20912 VkQueryPool query_pool;
20913 VkQueryPoolCreateInfo query_pool_create_info{};
20914 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20915 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20916 query_pool_create_info.queryCount = 1;
20917 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20918
20919 VkCommandPool command_pool;
20920 VkCommandPoolCreateInfo pool_create_info{};
20921 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20922 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20923 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20924 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20925
20926 VkCommandBuffer command_buffer;
20927 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20928 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20929 command_buffer_allocate_info.commandPool = command_pool;
20930 command_buffer_allocate_info.commandBufferCount = 1;
20931 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20932 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20933
20934 VkCommandBuffer secondary_command_buffer;
20935 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20936 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20937
20938 VkQueue queue = VK_NULL_HANDLE;
20939 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20940
20941 uint32_t qfi = 0;
20942 VkBufferCreateInfo buff_create_info = {};
20943 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20944 buff_create_info.size = 1024;
20945 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20946 buff_create_info.queueFamilyIndexCount = 1;
20947 buff_create_info.pQueueFamilyIndices = &qfi;
20948
20949 VkResult err;
20950 VkBuffer buffer;
20951 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20952 ASSERT_VK_SUCCESS(err);
20953 VkMemoryAllocateInfo mem_alloc = {};
20954 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20955 mem_alloc.pNext = NULL;
20956 mem_alloc.allocationSize = 1024;
20957 mem_alloc.memoryTypeIndex = 0;
20958
20959 VkMemoryRequirements memReqs;
20960 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20961 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20962 if (!pass) {
20963 vkDestroyBuffer(m_device->device(), buffer, NULL);
20964 return;
20965 }
20966
20967 VkDeviceMemory mem;
20968 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20969 ASSERT_VK_SUCCESS(err);
20970 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20971 ASSERT_VK_SUCCESS(err);
20972
20973 VkCommandBufferInheritanceInfo hinfo = {};
20974 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20975 hinfo.renderPass = VK_NULL_HANDLE;
20976 hinfo.subpass = 0;
20977 hinfo.framebuffer = VK_NULL_HANDLE;
20978 hinfo.occlusionQueryEnable = VK_FALSE;
20979 hinfo.queryFlags = 0;
20980 hinfo.pipelineStatistics = 0;
20981
20982 {
20983 VkCommandBufferBeginInfo begin_info{};
20984 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20985 begin_info.pInheritanceInfo = &hinfo;
20986 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20987
20988 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20989 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20990
20991 vkEndCommandBuffer(secondary_command_buffer);
20992
20993 begin_info.pInheritanceInfo = nullptr;
20994 vkBeginCommandBuffer(command_buffer, &begin_info);
20995
20996 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20997 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20998
20999 vkEndCommandBuffer(command_buffer);
21000 }
21001 {
21002 VkSubmitInfo submit_info{};
21003 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21004 submit_info.commandBufferCount = 1;
21005 submit_info.pCommandBuffers = &command_buffer;
21006 submit_info.signalSemaphoreCount = 0;
21007 submit_info.pSignalSemaphores = nullptr;
21008 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21009 }
21010
21011 vkQueueWaitIdle(queue);
21012
21013 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21014 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21015 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21016 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21017 vkDestroyBuffer(m_device->device(), buffer, NULL);
21018 vkFreeMemory(m_device->device(), mem, NULL);
21019
21020 m_errorMonitor->VerifyNotFound();
21021}
21022
21023// This is a positive test. No errors should be generated.
21024TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21025 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21026
Tony Barbour1fa09702017-03-16 12:09:08 -060021027 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021028 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021029
21030 m_errorMonitor->ExpectSuccess();
21031
21032 VkQueryPool query_pool;
21033 VkQueryPoolCreateInfo query_pool_create_info{};
21034 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21035 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21036 query_pool_create_info.queryCount = 1;
21037 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21038
21039 VkCommandPool command_pool;
21040 VkCommandPoolCreateInfo pool_create_info{};
21041 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21042 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21043 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21044 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21045
21046 VkCommandBuffer command_buffer[2];
21047 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21048 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21049 command_buffer_allocate_info.commandPool = command_pool;
21050 command_buffer_allocate_info.commandBufferCount = 2;
21051 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21052 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21053
21054 VkQueue queue = VK_NULL_HANDLE;
21055 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21056
21057 uint32_t qfi = 0;
21058 VkBufferCreateInfo buff_create_info = {};
21059 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21060 buff_create_info.size = 1024;
21061 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21062 buff_create_info.queueFamilyIndexCount = 1;
21063 buff_create_info.pQueueFamilyIndices = &qfi;
21064
21065 VkResult err;
21066 VkBuffer buffer;
21067 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21068 ASSERT_VK_SUCCESS(err);
21069 VkMemoryAllocateInfo mem_alloc = {};
21070 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21071 mem_alloc.pNext = NULL;
21072 mem_alloc.allocationSize = 1024;
21073 mem_alloc.memoryTypeIndex = 0;
21074
21075 VkMemoryRequirements memReqs;
21076 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21077 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21078 if (!pass) {
21079 vkDestroyBuffer(m_device->device(), buffer, NULL);
21080 return;
21081 }
21082
21083 VkDeviceMemory mem;
21084 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21085 ASSERT_VK_SUCCESS(err);
21086 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21087 ASSERT_VK_SUCCESS(err);
21088
21089 {
21090 VkCommandBufferBeginInfo begin_info{};
21091 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21092 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21093
21094 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21095 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21096
21097 vkEndCommandBuffer(command_buffer[0]);
21098
21099 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21100
21101 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21102
21103 vkEndCommandBuffer(command_buffer[1]);
21104 }
21105 {
21106 VkSubmitInfo submit_info{};
21107 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21108 submit_info.commandBufferCount = 2;
21109 submit_info.pCommandBuffers = command_buffer;
21110 submit_info.signalSemaphoreCount = 0;
21111 submit_info.pSignalSemaphores = nullptr;
21112 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21113 }
21114
21115 vkQueueWaitIdle(queue);
21116
21117 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21118 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
21119 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21120 vkDestroyBuffer(m_device->device(), buffer, NULL);
21121 vkFreeMemory(m_device->device(), mem, NULL);
21122
21123 m_errorMonitor->VerifyNotFound();
21124}
21125
Tony Barbourc46924f2016-11-04 11:49:52 -060021126TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021127 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
21128
Tony Barbour1fa09702017-03-16 12:09:08 -060021129 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021130 VkEvent event;
21131 VkEventCreateInfo event_create_info{};
21132 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21133 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21134
21135 VkCommandPool command_pool;
21136 VkCommandPoolCreateInfo pool_create_info{};
21137 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21138 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21139 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21140 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21141
21142 VkCommandBuffer command_buffer;
21143 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21144 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21145 command_buffer_allocate_info.commandPool = command_pool;
21146 command_buffer_allocate_info.commandBufferCount = 1;
21147 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21148 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21149
21150 VkQueue queue = VK_NULL_HANDLE;
21151 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21152
21153 {
21154 VkCommandBufferBeginInfo begin_info{};
21155 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21156 vkBeginCommandBuffer(command_buffer, &begin_info);
21157
21158 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021159 vkEndCommandBuffer(command_buffer);
21160 }
21161 {
21162 VkSubmitInfo submit_info{};
21163 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21164 submit_info.commandBufferCount = 1;
21165 submit_info.pCommandBuffers = &command_buffer;
21166 submit_info.signalSemaphoreCount = 0;
21167 submit_info.pSignalSemaphores = nullptr;
21168 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21169 }
21170 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
21172 "that is already in use by a "
21173 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021174 vkSetEvent(m_device->device(), event);
21175 m_errorMonitor->VerifyFound();
21176 }
21177
21178 vkQueueWaitIdle(queue);
21179
21180 vkDestroyEvent(m_device->device(), event, nullptr);
21181 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21182 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21183}
21184
21185// This is a positive test. No errors should be generated.
21186TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021187 TEST_DESCRIPTION(
21188 "Two command buffers with two separate fences are each "
21189 "run through a Submit & WaitForFences cycle 3 times. This "
21190 "previously revealed a bug so running this positive test "
21191 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021192 m_errorMonitor->ExpectSuccess();
21193
Tony Barbour1fa09702017-03-16 12:09:08 -060021194 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021195 VkQueue queue = VK_NULL_HANDLE;
21196 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21197
21198 static const uint32_t NUM_OBJECTS = 2;
21199 static const uint32_t NUM_FRAMES = 3;
21200 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
21201 VkFence fences[NUM_OBJECTS] = {};
21202
21203 VkCommandPool cmd_pool;
21204 VkCommandPoolCreateInfo cmd_pool_ci = {};
21205 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21206 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
21207 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21208 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
21209 ASSERT_VK_SUCCESS(err);
21210
21211 VkCommandBufferAllocateInfo cmd_buf_info = {};
21212 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21213 cmd_buf_info.commandPool = cmd_pool;
21214 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21215 cmd_buf_info.commandBufferCount = 1;
21216
21217 VkFenceCreateInfo fence_ci = {};
21218 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21219 fence_ci.pNext = nullptr;
21220 fence_ci.flags = 0;
21221
21222 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21223 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
21224 ASSERT_VK_SUCCESS(err);
21225 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
21226 ASSERT_VK_SUCCESS(err);
21227 }
21228
21229 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
21230 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
21231 // Create empty cmd buffer
21232 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
21233 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21234
21235 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
21236 ASSERT_VK_SUCCESS(err);
21237 err = vkEndCommandBuffer(cmd_buffers[obj]);
21238 ASSERT_VK_SUCCESS(err);
21239
21240 VkSubmitInfo submit_info = {};
21241 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21242 submit_info.commandBufferCount = 1;
21243 submit_info.pCommandBuffers = &cmd_buffers[obj];
21244 // Submit cmd buffer and wait for fence
21245 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
21246 ASSERT_VK_SUCCESS(err);
21247 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21248 ASSERT_VK_SUCCESS(err);
21249 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21250 ASSERT_VK_SUCCESS(err);
21251 }
21252 }
21253 m_errorMonitor->VerifyNotFound();
21254 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21255 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21256 vkDestroyFence(m_device->device(), fences[i], nullptr);
21257 }
21258}
21259// This is a positive test. No errors should be generated.
21260TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021261 TEST_DESCRIPTION(
21262 "Two command buffers, each in a separate QueueSubmit call "
21263 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021264
Tony Barbour1fa09702017-03-16 12:09:08 -060021265 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021266 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021267
21268 m_errorMonitor->ExpectSuccess();
21269
21270 VkSemaphore semaphore;
21271 VkSemaphoreCreateInfo semaphore_create_info{};
21272 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21273 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21274
21275 VkCommandPool command_pool;
21276 VkCommandPoolCreateInfo pool_create_info{};
21277 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21278 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21279 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21280 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21281
21282 VkCommandBuffer command_buffer[2];
21283 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21284 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21285 command_buffer_allocate_info.commandPool = command_pool;
21286 command_buffer_allocate_info.commandBufferCount = 2;
21287 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21288 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21289
21290 VkQueue queue = VK_NULL_HANDLE;
21291 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21292
21293 {
21294 VkCommandBufferBeginInfo begin_info{};
21295 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21296 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21297
21298 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 -070021299 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021300
21301 VkViewport viewport{};
21302 viewport.maxDepth = 1.0f;
21303 viewport.minDepth = 0.0f;
21304 viewport.width = 512;
21305 viewport.height = 512;
21306 viewport.x = 0;
21307 viewport.y = 0;
21308 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21309 vkEndCommandBuffer(command_buffer[0]);
21310 }
21311 {
21312 VkCommandBufferBeginInfo begin_info{};
21313 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21314 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21315
21316 VkViewport viewport{};
21317 viewport.maxDepth = 1.0f;
21318 viewport.minDepth = 0.0f;
21319 viewport.width = 512;
21320 viewport.height = 512;
21321 viewport.x = 0;
21322 viewport.y = 0;
21323 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21324 vkEndCommandBuffer(command_buffer[1]);
21325 }
21326 {
21327 VkSubmitInfo submit_info{};
21328 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21329 submit_info.commandBufferCount = 1;
21330 submit_info.pCommandBuffers = &command_buffer[0];
21331 submit_info.signalSemaphoreCount = 1;
21332 submit_info.pSignalSemaphores = &semaphore;
21333 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21334 }
21335 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021336 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021337 VkSubmitInfo submit_info{};
21338 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21339 submit_info.commandBufferCount = 1;
21340 submit_info.pCommandBuffers = &command_buffer[1];
21341 submit_info.waitSemaphoreCount = 1;
21342 submit_info.pWaitSemaphores = &semaphore;
21343 submit_info.pWaitDstStageMask = flags;
21344 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21345 }
21346
21347 vkQueueWaitIdle(m_device->m_queue);
21348
21349 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21350 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21351 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21352
21353 m_errorMonitor->VerifyNotFound();
21354}
21355
21356// This is a positive test. No errors should be generated.
21357TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021358 TEST_DESCRIPTION(
21359 "Two command buffers, each in a separate QueueSubmit call "
21360 "submitted on separate queues, the second having a fence"
21361 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021362
Tony Barbour1fa09702017-03-16 12:09:08 -060021363 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021364 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021365
21366 m_errorMonitor->ExpectSuccess();
21367
21368 VkFence fence;
21369 VkFenceCreateInfo fence_create_info{};
21370 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21371 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21372
21373 VkSemaphore semaphore;
21374 VkSemaphoreCreateInfo semaphore_create_info{};
21375 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21376 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21377
21378 VkCommandPool command_pool;
21379 VkCommandPoolCreateInfo pool_create_info{};
21380 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21381 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21382 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21383 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21384
21385 VkCommandBuffer command_buffer[2];
21386 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21387 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21388 command_buffer_allocate_info.commandPool = command_pool;
21389 command_buffer_allocate_info.commandBufferCount = 2;
21390 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21391 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21392
21393 VkQueue queue = VK_NULL_HANDLE;
21394 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21395
21396 {
21397 VkCommandBufferBeginInfo begin_info{};
21398 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21399 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21400
21401 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 -070021402 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021403
21404 VkViewport viewport{};
21405 viewport.maxDepth = 1.0f;
21406 viewport.minDepth = 0.0f;
21407 viewport.width = 512;
21408 viewport.height = 512;
21409 viewport.x = 0;
21410 viewport.y = 0;
21411 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21412 vkEndCommandBuffer(command_buffer[0]);
21413 }
21414 {
21415 VkCommandBufferBeginInfo begin_info{};
21416 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21417 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21418
21419 VkViewport viewport{};
21420 viewport.maxDepth = 1.0f;
21421 viewport.minDepth = 0.0f;
21422 viewport.width = 512;
21423 viewport.height = 512;
21424 viewport.x = 0;
21425 viewport.y = 0;
21426 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21427 vkEndCommandBuffer(command_buffer[1]);
21428 }
21429 {
21430 VkSubmitInfo submit_info{};
21431 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21432 submit_info.commandBufferCount = 1;
21433 submit_info.pCommandBuffers = &command_buffer[0];
21434 submit_info.signalSemaphoreCount = 1;
21435 submit_info.pSignalSemaphores = &semaphore;
21436 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21437 }
21438 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021439 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021440 VkSubmitInfo submit_info{};
21441 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21442 submit_info.commandBufferCount = 1;
21443 submit_info.pCommandBuffers = &command_buffer[1];
21444 submit_info.waitSemaphoreCount = 1;
21445 submit_info.pWaitSemaphores = &semaphore;
21446 submit_info.pWaitDstStageMask = flags;
21447 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21448 }
21449
21450 vkQueueWaitIdle(m_device->m_queue);
21451
21452 vkDestroyFence(m_device->device(), fence, nullptr);
21453 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21454 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21455 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21456
21457 m_errorMonitor->VerifyNotFound();
21458}
21459
21460// This is a positive test. No errors should be generated.
21461TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021462 TEST_DESCRIPTION(
21463 "Two command buffers, each in a separate QueueSubmit call "
21464 "submitted on separate queues, the second having a fence"
21465 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021466
Tony Barbour1fa09702017-03-16 12:09:08 -060021467 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021468 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021469
21470 m_errorMonitor->ExpectSuccess();
21471
21472 VkFence fence;
21473 VkFenceCreateInfo fence_create_info{};
21474 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21475 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21476
21477 VkSemaphore semaphore;
21478 VkSemaphoreCreateInfo semaphore_create_info{};
21479 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21480 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21481
21482 VkCommandPool command_pool;
21483 VkCommandPoolCreateInfo pool_create_info{};
21484 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21485 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21486 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21487 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21488
21489 VkCommandBuffer command_buffer[2];
21490 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21491 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21492 command_buffer_allocate_info.commandPool = command_pool;
21493 command_buffer_allocate_info.commandBufferCount = 2;
21494 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21495 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21496
21497 VkQueue queue = VK_NULL_HANDLE;
21498 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21499
21500 {
21501 VkCommandBufferBeginInfo begin_info{};
21502 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21503 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21504
21505 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 -070021506 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021507
21508 VkViewport viewport{};
21509 viewport.maxDepth = 1.0f;
21510 viewport.minDepth = 0.0f;
21511 viewport.width = 512;
21512 viewport.height = 512;
21513 viewport.x = 0;
21514 viewport.y = 0;
21515 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21516 vkEndCommandBuffer(command_buffer[0]);
21517 }
21518 {
21519 VkCommandBufferBeginInfo begin_info{};
21520 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21521 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21522
21523 VkViewport viewport{};
21524 viewport.maxDepth = 1.0f;
21525 viewport.minDepth = 0.0f;
21526 viewport.width = 512;
21527 viewport.height = 512;
21528 viewport.x = 0;
21529 viewport.y = 0;
21530 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21531 vkEndCommandBuffer(command_buffer[1]);
21532 }
21533 {
21534 VkSubmitInfo submit_info{};
21535 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21536 submit_info.commandBufferCount = 1;
21537 submit_info.pCommandBuffers = &command_buffer[0];
21538 submit_info.signalSemaphoreCount = 1;
21539 submit_info.pSignalSemaphores = &semaphore;
21540 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21541 }
21542 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021543 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021544 VkSubmitInfo submit_info{};
21545 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21546 submit_info.commandBufferCount = 1;
21547 submit_info.pCommandBuffers = &command_buffer[1];
21548 submit_info.waitSemaphoreCount = 1;
21549 submit_info.pWaitSemaphores = &semaphore;
21550 submit_info.pWaitDstStageMask = flags;
21551 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21552 }
21553
21554 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21555 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21556
21557 vkDestroyFence(m_device->device(), fence, nullptr);
21558 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21559 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21560 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21561
21562 m_errorMonitor->VerifyNotFound();
21563}
21564
21565TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021566 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021567 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021568 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021569 return;
21570 }
21571
21572 VkResult err;
21573
21574 m_errorMonitor->ExpectSuccess();
21575
21576 VkQueue q0 = m_device->m_queue;
21577 VkQueue q1 = nullptr;
21578 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21579 ASSERT_NE(q1, nullptr);
21580
21581 // An (empty) command buffer. We must have work in the first submission --
21582 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021583 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021584 VkCommandPool pool;
21585 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21586 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021587 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21588 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021589 VkCommandBuffer cb;
21590 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21591 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021592 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021593 err = vkBeginCommandBuffer(cb, &cbbi);
21594 ASSERT_VK_SUCCESS(err);
21595 err = vkEndCommandBuffer(cb);
21596 ASSERT_VK_SUCCESS(err);
21597
21598 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021599 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021600 VkSemaphore s;
21601 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21602 ASSERT_VK_SUCCESS(err);
21603
21604 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021605 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021606
21607 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21608 ASSERT_VK_SUCCESS(err);
21609
21610 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021611 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021612 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021613
21614 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21615 ASSERT_VK_SUCCESS(err);
21616
21617 // Wait for q0 idle
21618 err = vkQueueWaitIdle(q0);
21619 ASSERT_VK_SUCCESS(err);
21620
21621 // Command buffer should have been completed (it was on q0); reset the pool.
21622 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21623
21624 m_errorMonitor->VerifyNotFound();
21625
21626 // Force device completely idle and clean up resources
21627 vkDeviceWaitIdle(m_device->device());
21628 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21629 vkDestroySemaphore(m_device->device(), s, nullptr);
21630}
21631
21632// This is a positive test. No errors should be generated.
21633TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021634 TEST_DESCRIPTION(
21635 "Two command buffers, each in a separate QueueSubmit call "
21636 "submitted on separate queues, the second having a fence, "
21637 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021638
Tony Barbour1fa09702017-03-16 12:09:08 -060021639 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021640 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021641
21642 m_errorMonitor->ExpectSuccess();
21643
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021644 VkFence fence;
21645 VkFenceCreateInfo fence_create_info{};
21646 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21647 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21648
21649 VkSemaphore semaphore;
21650 VkSemaphoreCreateInfo semaphore_create_info{};
21651 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21652 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21653
21654 VkCommandPool command_pool;
21655 VkCommandPoolCreateInfo pool_create_info{};
21656 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21657 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21658 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21659 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21660
21661 VkCommandBuffer command_buffer[2];
21662 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21663 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21664 command_buffer_allocate_info.commandPool = command_pool;
21665 command_buffer_allocate_info.commandBufferCount = 2;
21666 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21667 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21668
21669 VkQueue queue = VK_NULL_HANDLE;
21670 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21671
21672 {
21673 VkCommandBufferBeginInfo begin_info{};
21674 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21675 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21676
21677 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 -070021678 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021679
21680 VkViewport viewport{};
21681 viewport.maxDepth = 1.0f;
21682 viewport.minDepth = 0.0f;
21683 viewport.width = 512;
21684 viewport.height = 512;
21685 viewport.x = 0;
21686 viewport.y = 0;
21687 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21688 vkEndCommandBuffer(command_buffer[0]);
21689 }
21690 {
21691 VkCommandBufferBeginInfo begin_info{};
21692 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21693 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21694
21695 VkViewport viewport{};
21696 viewport.maxDepth = 1.0f;
21697 viewport.minDepth = 0.0f;
21698 viewport.width = 512;
21699 viewport.height = 512;
21700 viewport.x = 0;
21701 viewport.y = 0;
21702 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21703 vkEndCommandBuffer(command_buffer[1]);
21704 }
21705 {
21706 VkSubmitInfo submit_info{};
21707 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21708 submit_info.commandBufferCount = 1;
21709 submit_info.pCommandBuffers = &command_buffer[0];
21710 submit_info.signalSemaphoreCount = 1;
21711 submit_info.pSignalSemaphores = &semaphore;
21712 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21713 }
21714 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021715 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021716 VkSubmitInfo submit_info{};
21717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21718 submit_info.commandBufferCount = 1;
21719 submit_info.pCommandBuffers = &command_buffer[1];
21720 submit_info.waitSemaphoreCount = 1;
21721 submit_info.pWaitSemaphores = &semaphore;
21722 submit_info.pWaitDstStageMask = flags;
21723 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21724 }
21725
21726 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21727
21728 vkDestroyFence(m_device->device(), fence, nullptr);
21729 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21730 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21731 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21732
21733 m_errorMonitor->VerifyNotFound();
21734}
21735
21736// This is a positive test. No errors should be generated.
21737TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021738 TEST_DESCRIPTION(
21739 "Two command buffers, each in a separate QueueSubmit call "
21740 "on the same queue, sharing a signal/wait semaphore, the "
21741 "second having a fence, "
21742 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021743
21744 m_errorMonitor->ExpectSuccess();
21745
Tony Barbour1fa09702017-03-16 12:09:08 -060021746 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021747 VkFence fence;
21748 VkFenceCreateInfo fence_create_info{};
21749 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21750 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21751
21752 VkSemaphore semaphore;
21753 VkSemaphoreCreateInfo semaphore_create_info{};
21754 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21755 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21756
21757 VkCommandPool command_pool;
21758 VkCommandPoolCreateInfo pool_create_info{};
21759 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21760 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21761 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21762 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21763
21764 VkCommandBuffer command_buffer[2];
21765 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21766 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21767 command_buffer_allocate_info.commandPool = command_pool;
21768 command_buffer_allocate_info.commandBufferCount = 2;
21769 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21770 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21771
21772 {
21773 VkCommandBufferBeginInfo begin_info{};
21774 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21775 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21776
21777 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 -070021778 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021779
21780 VkViewport viewport{};
21781 viewport.maxDepth = 1.0f;
21782 viewport.minDepth = 0.0f;
21783 viewport.width = 512;
21784 viewport.height = 512;
21785 viewport.x = 0;
21786 viewport.y = 0;
21787 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21788 vkEndCommandBuffer(command_buffer[0]);
21789 }
21790 {
21791 VkCommandBufferBeginInfo begin_info{};
21792 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21793 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21794
21795 VkViewport viewport{};
21796 viewport.maxDepth = 1.0f;
21797 viewport.minDepth = 0.0f;
21798 viewport.width = 512;
21799 viewport.height = 512;
21800 viewport.x = 0;
21801 viewport.y = 0;
21802 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21803 vkEndCommandBuffer(command_buffer[1]);
21804 }
21805 {
21806 VkSubmitInfo submit_info{};
21807 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21808 submit_info.commandBufferCount = 1;
21809 submit_info.pCommandBuffers = &command_buffer[0];
21810 submit_info.signalSemaphoreCount = 1;
21811 submit_info.pSignalSemaphores = &semaphore;
21812 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21813 }
21814 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021815 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021816 VkSubmitInfo submit_info{};
21817 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21818 submit_info.commandBufferCount = 1;
21819 submit_info.pCommandBuffers = &command_buffer[1];
21820 submit_info.waitSemaphoreCount = 1;
21821 submit_info.pWaitSemaphores = &semaphore;
21822 submit_info.pWaitDstStageMask = flags;
21823 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21824 }
21825
21826 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21827
21828 vkDestroyFence(m_device->device(), fence, nullptr);
21829 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21830 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21831 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21832
21833 m_errorMonitor->VerifyNotFound();
21834}
21835
21836// This is a positive test. No errors should be generated.
21837TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021838 TEST_DESCRIPTION(
21839 "Two command buffers, each in a separate QueueSubmit call "
21840 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21841 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021842
21843 m_errorMonitor->ExpectSuccess();
21844
Tony Barbour1fa09702017-03-16 12:09:08 -060021845 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021846 VkFence fence;
21847 VkFenceCreateInfo fence_create_info{};
21848 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21849 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21850
21851 VkCommandPool command_pool;
21852 VkCommandPoolCreateInfo pool_create_info{};
21853 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21854 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21855 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21856 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21857
21858 VkCommandBuffer command_buffer[2];
21859 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21860 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21861 command_buffer_allocate_info.commandPool = command_pool;
21862 command_buffer_allocate_info.commandBufferCount = 2;
21863 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21864 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21865
21866 {
21867 VkCommandBufferBeginInfo begin_info{};
21868 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21869 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21870
21871 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 -070021872 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021873
21874 VkViewport viewport{};
21875 viewport.maxDepth = 1.0f;
21876 viewport.minDepth = 0.0f;
21877 viewport.width = 512;
21878 viewport.height = 512;
21879 viewport.x = 0;
21880 viewport.y = 0;
21881 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21882 vkEndCommandBuffer(command_buffer[0]);
21883 }
21884 {
21885 VkCommandBufferBeginInfo begin_info{};
21886 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21887 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21888
21889 VkViewport viewport{};
21890 viewport.maxDepth = 1.0f;
21891 viewport.minDepth = 0.0f;
21892 viewport.width = 512;
21893 viewport.height = 512;
21894 viewport.x = 0;
21895 viewport.y = 0;
21896 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21897 vkEndCommandBuffer(command_buffer[1]);
21898 }
21899 {
21900 VkSubmitInfo submit_info{};
21901 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21902 submit_info.commandBufferCount = 1;
21903 submit_info.pCommandBuffers = &command_buffer[0];
21904 submit_info.signalSemaphoreCount = 0;
21905 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21906 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21907 }
21908 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021909 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021910 VkSubmitInfo submit_info{};
21911 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21912 submit_info.commandBufferCount = 1;
21913 submit_info.pCommandBuffers = &command_buffer[1];
21914 submit_info.waitSemaphoreCount = 0;
21915 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21916 submit_info.pWaitDstStageMask = flags;
21917 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21918 }
21919
21920 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21921
21922 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21923 ASSERT_VK_SUCCESS(err);
21924
21925 vkDestroyFence(m_device->device(), fence, nullptr);
21926 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21927 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21928
21929 m_errorMonitor->VerifyNotFound();
21930}
21931
21932// This is a positive test. No errors should be generated.
21933TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021934 TEST_DESCRIPTION(
21935 "Two command buffers, each in a separate QueueSubmit call "
21936 "on the same queue, the second having a fence, followed "
21937 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021938
21939 m_errorMonitor->ExpectSuccess();
21940
Tony Barbour1fa09702017-03-16 12:09:08 -060021941 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021942 VkFence fence;
21943 VkFenceCreateInfo fence_create_info{};
21944 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21945 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21946
21947 VkCommandPool command_pool;
21948 VkCommandPoolCreateInfo pool_create_info{};
21949 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21950 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21951 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21952 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21953
21954 VkCommandBuffer command_buffer[2];
21955 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21956 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21957 command_buffer_allocate_info.commandPool = command_pool;
21958 command_buffer_allocate_info.commandBufferCount = 2;
21959 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21960 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21961
21962 {
21963 VkCommandBufferBeginInfo begin_info{};
21964 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21965 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21966
21967 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 -070021968 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021969
21970 VkViewport viewport{};
21971 viewport.maxDepth = 1.0f;
21972 viewport.minDepth = 0.0f;
21973 viewport.width = 512;
21974 viewport.height = 512;
21975 viewport.x = 0;
21976 viewport.y = 0;
21977 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21978 vkEndCommandBuffer(command_buffer[0]);
21979 }
21980 {
21981 VkCommandBufferBeginInfo begin_info{};
21982 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21983 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21984
21985 VkViewport viewport{};
21986 viewport.maxDepth = 1.0f;
21987 viewport.minDepth = 0.0f;
21988 viewport.width = 512;
21989 viewport.height = 512;
21990 viewport.x = 0;
21991 viewport.y = 0;
21992 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21993 vkEndCommandBuffer(command_buffer[1]);
21994 }
21995 {
21996 VkSubmitInfo submit_info{};
21997 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21998 submit_info.commandBufferCount = 1;
21999 submit_info.pCommandBuffers = &command_buffer[0];
22000 submit_info.signalSemaphoreCount = 0;
22001 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22002 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22003 }
22004 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022005 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022006 VkSubmitInfo submit_info{};
22007 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22008 submit_info.commandBufferCount = 1;
22009 submit_info.pCommandBuffers = &command_buffer[1];
22010 submit_info.waitSemaphoreCount = 0;
22011 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22012 submit_info.pWaitDstStageMask = flags;
22013 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22014 }
22015
22016 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22017
22018 vkDestroyFence(m_device->device(), fence, nullptr);
22019 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22020 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22021
22022 m_errorMonitor->VerifyNotFound();
22023}
22024
22025// This is a positive test. No errors should be generated.
22026TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022027 TEST_DESCRIPTION(
22028 "Two command buffers each in a separate SubmitInfo sent in a single "
22029 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022030 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022031
22032 m_errorMonitor->ExpectSuccess();
22033
22034 VkFence fence;
22035 VkFenceCreateInfo fence_create_info{};
22036 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22037 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22038
22039 VkSemaphore semaphore;
22040 VkSemaphoreCreateInfo semaphore_create_info{};
22041 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22042 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22043
22044 VkCommandPool command_pool;
22045 VkCommandPoolCreateInfo pool_create_info{};
22046 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22047 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22048 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22049 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22050
22051 VkCommandBuffer command_buffer[2];
22052 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22053 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22054 command_buffer_allocate_info.commandPool = command_pool;
22055 command_buffer_allocate_info.commandBufferCount = 2;
22056 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22057 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22058
22059 {
22060 VkCommandBufferBeginInfo begin_info{};
22061 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22062 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22063
22064 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022065 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022066
22067 VkViewport viewport{};
22068 viewport.maxDepth = 1.0f;
22069 viewport.minDepth = 0.0f;
22070 viewport.width = 512;
22071 viewport.height = 512;
22072 viewport.x = 0;
22073 viewport.y = 0;
22074 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22075 vkEndCommandBuffer(command_buffer[0]);
22076 }
22077 {
22078 VkCommandBufferBeginInfo begin_info{};
22079 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22080 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22081
22082 VkViewport viewport{};
22083 viewport.maxDepth = 1.0f;
22084 viewport.minDepth = 0.0f;
22085 viewport.width = 512;
22086 viewport.height = 512;
22087 viewport.x = 0;
22088 viewport.y = 0;
22089 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22090 vkEndCommandBuffer(command_buffer[1]);
22091 }
22092 {
22093 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022094 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022095
22096 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22097 submit_info[0].pNext = NULL;
22098 submit_info[0].commandBufferCount = 1;
22099 submit_info[0].pCommandBuffers = &command_buffer[0];
22100 submit_info[0].signalSemaphoreCount = 1;
22101 submit_info[0].pSignalSemaphores = &semaphore;
22102 submit_info[0].waitSemaphoreCount = 0;
22103 submit_info[0].pWaitSemaphores = NULL;
22104 submit_info[0].pWaitDstStageMask = 0;
22105
22106 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22107 submit_info[1].pNext = NULL;
22108 submit_info[1].commandBufferCount = 1;
22109 submit_info[1].pCommandBuffers = &command_buffer[1];
22110 submit_info[1].waitSemaphoreCount = 1;
22111 submit_info[1].pWaitSemaphores = &semaphore;
22112 submit_info[1].pWaitDstStageMask = flags;
22113 submit_info[1].signalSemaphoreCount = 0;
22114 submit_info[1].pSignalSemaphores = NULL;
22115 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
22116 }
22117
22118 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22119
22120 vkDestroyFence(m_device->device(), fence, nullptr);
22121 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22122 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22123 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22124
22125 m_errorMonitor->VerifyNotFound();
22126}
22127
22128TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
22129 m_errorMonitor->ExpectSuccess();
22130
Tony Barbour1fa09702017-03-16 12:09:08 -060022131 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022132 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22133
Tony Barbour552f6c02016-12-21 14:34:07 -070022134 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022135
22136 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
22137 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22138 m_errorMonitor->VerifyNotFound();
22139 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
22140 m_errorMonitor->VerifyNotFound();
22141 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22142 m_errorMonitor->VerifyNotFound();
22143
22144 m_commandBuffer->EndCommandBuffer();
22145 m_errorMonitor->VerifyNotFound();
22146}
22147
22148TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022149 TEST_DESCRIPTION(
22150 "Positive test where we create a renderpass with an "
22151 "attachment that uses LOAD_OP_CLEAR, the first subpass "
22152 "has a valid layout, and a second subpass then uses a "
22153 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022154 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060022155 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022156 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022157 if (!depth_format) {
22158 printf(" No Depth + Stencil format found. Skipped.\n");
22159 return;
22160 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022161
22162 VkAttachmentReference attach[2] = {};
22163 attach[0].attachment = 0;
22164 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22165 attach[1].attachment = 0;
22166 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22167 VkSubpassDescription subpasses[2] = {};
22168 // First subpass clears DS attach on load
22169 subpasses[0].pDepthStencilAttachment = &attach[0];
22170 // 2nd subpass reads in DS as input attachment
22171 subpasses[1].inputAttachmentCount = 1;
22172 subpasses[1].pInputAttachments = &attach[1];
22173 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070022174 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022175 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
22176 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
22177 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
22178 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22179 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22180 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22181 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22182 VkRenderPassCreateInfo rpci = {};
22183 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
22184 rpci.attachmentCount = 1;
22185 rpci.pAttachments = &attach_desc;
22186 rpci.subpassCount = 2;
22187 rpci.pSubpasses = subpasses;
22188
22189 // Now create RenderPass and verify no errors
22190 VkRenderPass rp;
22191 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
22192 m_errorMonitor->VerifyNotFound();
22193
22194 vkDestroyRenderPass(m_device->device(), rp, NULL);
22195}
22196
Tobin Ehlis01103de2017-02-16 13:22:47 -070022197TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
22198 TEST_DESCRIPTION(
22199 "Create a render pass with depth-stencil attachment where layout transition "
22200 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
22201 "transition has correctly occurred at queue submit time with no validation errors.");
22202
Tony Barbour1fa09702017-03-16 12:09:08 -060022203 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022204 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022205 if (!depth_format) {
22206 printf(" No Depth + Stencil format found. Skipped.\n");
22207 return;
22208 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070022209 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070022210 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022211 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
22212 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070022213 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070022214 return;
22215 }
22216
22217 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070022218 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22219
22220 // A renderpass with one depth/stencil attachment.
22221 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070022222 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022223 VK_SAMPLE_COUNT_1_BIT,
22224 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22225 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22226 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22227 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22228 VK_IMAGE_LAYOUT_UNDEFINED,
22229 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22230
22231 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22232
22233 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
22234
22235 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
22236
22237 VkRenderPass rp;
22238 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22239 ASSERT_VK_SUCCESS(err);
22240 // A compatible ds image.
22241 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022242 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 -070022243 ASSERT_TRUE(image.initialized());
22244
22245 VkImageViewCreateInfo ivci = {
22246 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22247 nullptr,
22248 0,
22249 image.handle(),
22250 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022251 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022252 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22253 VK_COMPONENT_SWIZZLE_IDENTITY},
22254 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22255 };
22256 VkImageView view;
22257 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22258 ASSERT_VK_SUCCESS(err);
22259
22260 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22261 VkFramebuffer fb;
22262 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22263 ASSERT_VK_SUCCESS(err);
22264
22265 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22266 m_commandBuffer->BeginCommandBuffer();
22267 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22268 vkCmdEndRenderPass(m_commandBuffer->handle());
22269 m_commandBuffer->EndCommandBuffer();
22270 QueueCommandBuffer(false);
22271 m_errorMonitor->VerifyNotFound();
22272
22273 // Cleanup
22274 vkDestroyImageView(m_device->device(), view, NULL);
22275 vkDestroyRenderPass(m_device->device(), rp, NULL);
22276 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22277}
22278
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022279TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022280 TEST_DESCRIPTION(
22281 "Test that pipeline validation accepts matrices passed "
22282 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022283 m_errorMonitor->ExpectSuccess();
22284
Tony Barbour1fa09702017-03-16 12:09:08 -060022285 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22287
22288 VkVertexInputBindingDescription input_binding;
22289 memset(&input_binding, 0, sizeof(input_binding));
22290
22291 VkVertexInputAttributeDescription input_attribs[2];
22292 memset(input_attribs, 0, sizeof(input_attribs));
22293
22294 for (int i = 0; i < 2; i++) {
22295 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22296 input_attribs[i].location = i;
22297 }
22298
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022299 char const *vsSource =
22300 "#version 450\n"
22301 "\n"
22302 "layout(location=0) in mat2x4 x;\n"
22303 "out gl_PerVertex {\n"
22304 " vec4 gl_Position;\n"
22305 "};\n"
22306 "void main(){\n"
22307 " gl_Position = x[0] + x[1];\n"
22308 "}\n";
22309 char const *fsSource =
22310 "#version 450\n"
22311 "\n"
22312 "layout(location=0) out vec4 color;\n"
22313 "void main(){\n"
22314 " color = vec4(1);\n"
22315 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022316
22317 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22318 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22319
22320 VkPipelineObj pipe(m_device);
22321 pipe.AddColorAttachment();
22322 pipe.AddShader(&vs);
22323 pipe.AddShader(&fs);
22324
22325 pipe.AddVertexInputBindings(&input_binding, 1);
22326 pipe.AddVertexInputAttribs(input_attribs, 2);
22327
22328 VkDescriptorSetObj descriptorSet(m_device);
22329 descriptorSet.AppendDummy();
22330 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22331
22332 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22333
22334 /* expect success */
22335 m_errorMonitor->VerifyNotFound();
22336}
22337
22338TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22339 m_errorMonitor->ExpectSuccess();
22340
Tony Barbour1fa09702017-03-16 12:09:08 -060022341 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022342 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22343
22344 VkVertexInputBindingDescription input_binding;
22345 memset(&input_binding, 0, sizeof(input_binding));
22346
22347 VkVertexInputAttributeDescription input_attribs[2];
22348 memset(input_attribs, 0, sizeof(input_attribs));
22349
22350 for (int i = 0; i < 2; i++) {
22351 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22352 input_attribs[i].location = i;
22353 }
22354
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022355 char const *vsSource =
22356 "#version 450\n"
22357 "\n"
22358 "layout(location=0) in vec4 x[2];\n"
22359 "out gl_PerVertex {\n"
22360 " vec4 gl_Position;\n"
22361 "};\n"
22362 "void main(){\n"
22363 " gl_Position = x[0] + x[1];\n"
22364 "}\n";
22365 char const *fsSource =
22366 "#version 450\n"
22367 "\n"
22368 "layout(location=0) out vec4 color;\n"
22369 "void main(){\n"
22370 " color = vec4(1);\n"
22371 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022372
22373 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22374 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22375
22376 VkPipelineObj pipe(m_device);
22377 pipe.AddColorAttachment();
22378 pipe.AddShader(&vs);
22379 pipe.AddShader(&fs);
22380
22381 pipe.AddVertexInputBindings(&input_binding, 1);
22382 pipe.AddVertexInputAttribs(input_attribs, 2);
22383
22384 VkDescriptorSetObj descriptorSet(m_device);
22385 descriptorSet.AppendDummy();
22386 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22387
22388 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22389
22390 m_errorMonitor->VerifyNotFound();
22391}
22392
22393TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022394 TEST_DESCRIPTION(
22395 "Test that pipeline validation accepts consuming a vertex attribute "
22396 "through multiple vertex shader inputs, each consuming a different "
22397 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022398 m_errorMonitor->ExpectSuccess();
22399
Tony Barbour1fa09702017-03-16 12:09:08 -060022400 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022401 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22402
22403 VkVertexInputBindingDescription input_binding;
22404 memset(&input_binding, 0, sizeof(input_binding));
22405
22406 VkVertexInputAttributeDescription input_attribs[3];
22407 memset(input_attribs, 0, sizeof(input_attribs));
22408
22409 for (int i = 0; i < 3; i++) {
22410 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22411 input_attribs[i].location = i;
22412 }
22413
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022414 char const *vsSource =
22415 "#version 450\n"
22416 "\n"
22417 "layout(location=0) in vec4 x;\n"
22418 "layout(location=1) in vec3 y1;\n"
22419 "layout(location=1, component=3) in float y2;\n"
22420 "layout(location=2) in vec4 z;\n"
22421 "out gl_PerVertex {\n"
22422 " vec4 gl_Position;\n"
22423 "};\n"
22424 "void main(){\n"
22425 " gl_Position = x + vec4(y1, y2) + z;\n"
22426 "}\n";
22427 char const *fsSource =
22428 "#version 450\n"
22429 "\n"
22430 "layout(location=0) out vec4 color;\n"
22431 "void main(){\n"
22432 " color = vec4(1);\n"
22433 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022434
22435 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22436 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22437
22438 VkPipelineObj pipe(m_device);
22439 pipe.AddColorAttachment();
22440 pipe.AddShader(&vs);
22441 pipe.AddShader(&fs);
22442
22443 pipe.AddVertexInputBindings(&input_binding, 1);
22444 pipe.AddVertexInputAttribs(input_attribs, 3);
22445
22446 VkDescriptorSetObj descriptorSet(m_device);
22447 descriptorSet.AppendDummy();
22448 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22449
22450 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22451
22452 m_errorMonitor->VerifyNotFound();
22453}
22454
22455TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22456 m_errorMonitor->ExpectSuccess();
22457
Tony Barbour1fa09702017-03-16 12:09:08 -060022458 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022459 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22460
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022461 char const *vsSource =
22462 "#version 450\n"
22463 "out gl_PerVertex {\n"
22464 " vec4 gl_Position;\n"
22465 "};\n"
22466 "void main(){\n"
22467 " gl_Position = vec4(0);\n"
22468 "}\n";
22469 char const *fsSource =
22470 "#version 450\n"
22471 "\n"
22472 "layout(location=0) out vec4 color;\n"
22473 "void main(){\n"
22474 " color = vec4(1);\n"
22475 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022476
22477 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22478 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22479
22480 VkPipelineObj pipe(m_device);
22481 pipe.AddColorAttachment();
22482 pipe.AddShader(&vs);
22483 pipe.AddShader(&fs);
22484
22485 VkDescriptorSetObj descriptorSet(m_device);
22486 descriptorSet.AppendDummy();
22487 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22488
22489 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22490
22491 m_errorMonitor->VerifyNotFound();
22492}
22493
22494TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022495 TEST_DESCRIPTION(
22496 "Test that pipeline validation accepts the relaxed type matching rules "
22497 "set out in 14.1.3: fundamental type must match, and producer side must "
22498 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022499 m_errorMonitor->ExpectSuccess();
22500
22501 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22502
Tony Barbour1fa09702017-03-16 12:09:08 -060022503 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022506 char const *vsSource =
22507 "#version 450\n"
22508 "out gl_PerVertex {\n"
22509 " vec4 gl_Position;\n"
22510 "};\n"
22511 "layout(location=0) out vec3 x;\n"
22512 "layout(location=1) out ivec3 y;\n"
22513 "layout(location=2) out vec3 z;\n"
22514 "void main(){\n"
22515 " gl_Position = vec4(0);\n"
22516 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22517 "}\n";
22518 char const *fsSource =
22519 "#version 450\n"
22520 "\n"
22521 "layout(location=0) out vec4 color;\n"
22522 "layout(location=0) in float x;\n"
22523 "layout(location=1) flat in int y;\n"
22524 "layout(location=2) in vec2 z;\n"
22525 "void main(){\n"
22526 " color = vec4(1 + x + y + z.x);\n"
22527 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022528
22529 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22530 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22531
22532 VkPipelineObj pipe(m_device);
22533 pipe.AddColorAttachment();
22534 pipe.AddShader(&vs);
22535 pipe.AddShader(&fs);
22536
22537 VkDescriptorSetObj descriptorSet(m_device);
22538 descriptorSet.AppendDummy();
22539 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22540
22541 VkResult err = VK_SUCCESS;
22542 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22543 ASSERT_VK_SUCCESS(err);
22544
22545 m_errorMonitor->VerifyNotFound();
22546}
22547
22548TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022549 TEST_DESCRIPTION(
22550 "Test that pipeline validation accepts per-vertex variables "
22551 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022552 m_errorMonitor->ExpectSuccess();
22553
Tony Barbour1fa09702017-03-16 12:09:08 -060022554 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022555 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22556
22557 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022558 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022559 return;
22560 }
22561
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022562 char const *vsSource =
22563 "#version 450\n"
22564 "void main(){}\n";
22565 char const *tcsSource =
22566 "#version 450\n"
22567 "layout(location=0) out int x[];\n"
22568 "layout(vertices=3) out;\n"
22569 "void main(){\n"
22570 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22571 " gl_TessLevelInner[0] = 1;\n"
22572 " x[gl_InvocationID] = gl_InvocationID;\n"
22573 "}\n";
22574 char const *tesSource =
22575 "#version 450\n"
22576 "layout(triangles, equal_spacing, cw) in;\n"
22577 "layout(location=0) in int x[];\n"
22578 "out gl_PerVertex { vec4 gl_Position; };\n"
22579 "void main(){\n"
22580 " gl_Position.xyz = gl_TessCoord;\n"
22581 " gl_Position.w = x[0] + x[1] + x[2];\n"
22582 "}\n";
22583 char const *fsSource =
22584 "#version 450\n"
22585 "layout(location=0) out vec4 color;\n"
22586 "void main(){\n"
22587 " color = vec4(1);\n"
22588 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022589
22590 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22591 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22592 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22593 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22594
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022595 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22596 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022597
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022598 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022599
22600 VkPipelineObj pipe(m_device);
22601 pipe.SetInputAssembly(&iasci);
22602 pipe.SetTessellation(&tsci);
22603 pipe.AddColorAttachment();
22604 pipe.AddShader(&vs);
22605 pipe.AddShader(&tcs);
22606 pipe.AddShader(&tes);
22607 pipe.AddShader(&fs);
22608
22609 VkDescriptorSetObj descriptorSet(m_device);
22610 descriptorSet.AppendDummy();
22611 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22612
22613 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22614
22615 m_errorMonitor->VerifyNotFound();
22616}
22617
22618TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022619 TEST_DESCRIPTION(
22620 "Test that pipeline validation accepts a user-defined "
22621 "interface block passed into the geometry shader. This "
22622 "is interesting because the 'extra' array level is not "
22623 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022624 m_errorMonitor->ExpectSuccess();
22625
Tony Barbour1fa09702017-03-16 12:09:08 -060022626 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22628
22629 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022630 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022631 return;
22632 }
22633
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022634 char const *vsSource =
22635 "#version 450\n"
22636 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22637 "void main(){\n"
22638 " vs_out.x = vec4(1);\n"
22639 "}\n";
22640 char const *gsSource =
22641 "#version 450\n"
22642 "layout(triangles) in;\n"
22643 "layout(triangle_strip, max_vertices=3) out;\n"
22644 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22645 "out gl_PerVertex { vec4 gl_Position; };\n"
22646 "void main() {\n"
22647 " gl_Position = gs_in[0].x;\n"
22648 " EmitVertex();\n"
22649 "}\n";
22650 char const *fsSource =
22651 "#version 450\n"
22652 "layout(location=0) out vec4 color;\n"
22653 "void main(){\n"
22654 " color = vec4(1);\n"
22655 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022656
22657 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22658 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22659 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22660
22661 VkPipelineObj pipe(m_device);
22662 pipe.AddColorAttachment();
22663 pipe.AddShader(&vs);
22664 pipe.AddShader(&gs);
22665 pipe.AddShader(&fs);
22666
22667 VkDescriptorSetObj descriptorSet(m_device);
22668 descriptorSet.AppendDummy();
22669 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22670
22671 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22672
22673 m_errorMonitor->VerifyNotFound();
22674}
22675
22676TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022677 TEST_DESCRIPTION(
22678 "Test that pipeline validation accepts basic use of 64bit vertex "
22679 "attributes. This is interesting because they consume multiple "
22680 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022681 m_errorMonitor->ExpectSuccess();
22682
Tony Barbour1fa09702017-03-16 12:09:08 -060022683 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022684 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22685
22686 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022687 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022688 return;
22689 }
22690
22691 VkVertexInputBindingDescription input_bindings[1];
22692 memset(input_bindings, 0, sizeof(input_bindings));
22693
22694 VkVertexInputAttributeDescription input_attribs[4];
22695 memset(input_attribs, 0, sizeof(input_attribs));
22696 input_attribs[0].location = 0;
22697 input_attribs[0].offset = 0;
22698 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22699 input_attribs[1].location = 2;
22700 input_attribs[1].offset = 32;
22701 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22702 input_attribs[2].location = 4;
22703 input_attribs[2].offset = 64;
22704 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22705 input_attribs[3].location = 6;
22706 input_attribs[3].offset = 96;
22707 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22708
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022709 char const *vsSource =
22710 "#version 450\n"
22711 "\n"
22712 "layout(location=0) in dmat4 x;\n"
22713 "out gl_PerVertex {\n"
22714 " vec4 gl_Position;\n"
22715 "};\n"
22716 "void main(){\n"
22717 " gl_Position = vec4(x[0][0]);\n"
22718 "}\n";
22719 char const *fsSource =
22720 "#version 450\n"
22721 "\n"
22722 "layout(location=0) out vec4 color;\n"
22723 "void main(){\n"
22724 " color = vec4(1);\n"
22725 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022726
22727 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22728 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22729
22730 VkPipelineObj pipe(m_device);
22731 pipe.AddColorAttachment();
22732 pipe.AddShader(&vs);
22733 pipe.AddShader(&fs);
22734
22735 pipe.AddVertexInputBindings(input_bindings, 1);
22736 pipe.AddVertexInputAttribs(input_attribs, 4);
22737
22738 VkDescriptorSetObj descriptorSet(m_device);
22739 descriptorSet.AppendDummy();
22740 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22741
22742 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22743
22744 m_errorMonitor->VerifyNotFound();
22745}
22746
22747TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22748 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22749 m_errorMonitor->ExpectSuccess();
22750
Tony Barbour1fa09702017-03-16 12:09:08 -060022751 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022752
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022753 char const *vsSource =
22754 "#version 450\n"
22755 "\n"
22756 "out gl_PerVertex {\n"
22757 " vec4 gl_Position;\n"
22758 "};\n"
22759 "void main(){\n"
22760 " gl_Position = vec4(1);\n"
22761 "}\n";
22762 char const *fsSource =
22763 "#version 450\n"
22764 "\n"
22765 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22766 "layout(location=0) out vec4 color;\n"
22767 "void main() {\n"
22768 " color = subpassLoad(x);\n"
22769 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022770
22771 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22772 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22773
22774 VkPipelineObj pipe(m_device);
22775 pipe.AddShader(&vs);
22776 pipe.AddShader(&fs);
22777 pipe.AddColorAttachment();
22778 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22779
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022780 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22781 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022782 VkDescriptorSetLayout dsl;
22783 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22784 ASSERT_VK_SUCCESS(err);
22785
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022786 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022787 VkPipelineLayout pl;
22788 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22789 ASSERT_VK_SUCCESS(err);
22790
22791 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022792 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22793 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22794 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22795 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22796 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 -060022797 };
22798 VkAttachmentReference color = {
22799 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22800 };
22801 VkAttachmentReference input = {
22802 1, VK_IMAGE_LAYOUT_GENERAL,
22803 };
22804
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022805 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022806
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022807 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022808 VkRenderPass rp;
22809 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22810 ASSERT_VK_SUCCESS(err);
22811
22812 // should be OK. would go wrong here if it's going to...
22813 pipe.CreateVKPipeline(pl, rp);
22814
22815 m_errorMonitor->VerifyNotFound();
22816
22817 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22818 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22819 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22820}
22821
22822TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022823 TEST_DESCRIPTION(
22824 "Test that pipeline validation accepts a compute pipeline which declares a "
22825 "descriptor-backed resource which is not provided, but the shader does not "
22826 "statically use it. This is interesting because it requires compute pipelines "
22827 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022828 m_errorMonitor->ExpectSuccess();
22829
Tony Barbour1fa09702017-03-16 12:09:08 -060022830 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022831
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022832 char const *csSource =
22833 "#version 450\n"
22834 "\n"
22835 "layout(local_size_x=1) in;\n"
22836 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22837 "void main(){\n"
22838 " // x is not used.\n"
22839 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022840
22841 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22842
22843 VkDescriptorSetObj descriptorSet(m_device);
22844 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22845
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022846 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22847 nullptr,
22848 0,
22849 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22850 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22851 descriptorSet.GetPipelineLayout(),
22852 VK_NULL_HANDLE,
22853 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022854
22855 VkPipeline pipe;
22856 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22857
22858 m_errorMonitor->VerifyNotFound();
22859
22860 if (err == VK_SUCCESS) {
22861 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22862 }
22863}
22864
22865TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022866 TEST_DESCRIPTION(
22867 "Test that pipeline validation accepts a shader consuming only the "
22868 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022869 m_errorMonitor->ExpectSuccess();
22870
Tony Barbour1fa09702017-03-16 12:09:08 -060022871 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022872
22873 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022874 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22875 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22876 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022877 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022878 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022879 VkDescriptorSetLayout dsl;
22880 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22881 ASSERT_VK_SUCCESS(err);
22882
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022883 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022884 VkPipelineLayout pl;
22885 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22886 ASSERT_VK_SUCCESS(err);
22887
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022888 char const *csSource =
22889 "#version 450\n"
22890 "\n"
22891 "layout(local_size_x=1) in;\n"
22892 "layout(set=0, binding=0) uniform sampler s;\n"
22893 "layout(set=0, binding=1) uniform texture2D t;\n"
22894 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22895 "void main() {\n"
22896 " x = texture(sampler2D(t, s), vec2(0));\n"
22897 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022898 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22899
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022900 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22901 nullptr,
22902 0,
22903 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22904 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22905 pl,
22906 VK_NULL_HANDLE,
22907 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022908
22909 VkPipeline pipe;
22910 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22911
22912 m_errorMonitor->VerifyNotFound();
22913
22914 if (err == VK_SUCCESS) {
22915 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22916 }
22917
22918 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22919 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22920}
22921
22922TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022923 TEST_DESCRIPTION(
22924 "Test that pipeline validation accepts a shader consuming only the "
22925 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022926 m_errorMonitor->ExpectSuccess();
22927
Tony Barbour1fa09702017-03-16 12:09:08 -060022928 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022929
22930 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022931 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22932 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22933 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022934 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022935 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022936 VkDescriptorSetLayout dsl;
22937 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22938 ASSERT_VK_SUCCESS(err);
22939
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022940 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022941 VkPipelineLayout pl;
22942 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22943 ASSERT_VK_SUCCESS(err);
22944
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022945 char const *csSource =
22946 "#version 450\n"
22947 "\n"
22948 "layout(local_size_x=1) in;\n"
22949 "layout(set=0, binding=0) uniform texture2D t;\n"
22950 "layout(set=0, binding=1) uniform sampler s;\n"
22951 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22952 "void main() {\n"
22953 " x = texture(sampler2D(t, s), vec2(0));\n"
22954 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022955 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22956
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022957 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22958 nullptr,
22959 0,
22960 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22961 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22962 pl,
22963 VK_NULL_HANDLE,
22964 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022965
22966 VkPipeline pipe;
22967 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22968
22969 m_errorMonitor->VerifyNotFound();
22970
22971 if (err == VK_SUCCESS) {
22972 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22973 }
22974
22975 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22976 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22977}
22978
22979TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022980 TEST_DESCRIPTION(
22981 "Test that pipeline validation accepts a shader consuming "
22982 "both the sampler and the image of a combined image+sampler "
22983 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022984 m_errorMonitor->ExpectSuccess();
22985
Tony Barbour1fa09702017-03-16 12:09:08 -060022986 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022987
22988 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022989 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22990 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022991 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022992 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022993 VkDescriptorSetLayout dsl;
22994 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22995 ASSERT_VK_SUCCESS(err);
22996
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022997 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022998 VkPipelineLayout pl;
22999 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23000 ASSERT_VK_SUCCESS(err);
23001
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023002 char const *csSource =
23003 "#version 450\n"
23004 "\n"
23005 "layout(local_size_x=1) in;\n"
23006 "layout(set=0, binding=0) uniform texture2D t;\n"
23007 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
23008 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
23009 "void main() {\n"
23010 " x = texture(sampler2D(t, s), vec2(0));\n"
23011 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023012 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23013
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023014 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23015 nullptr,
23016 0,
23017 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23018 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23019 pl,
23020 VK_NULL_HANDLE,
23021 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023022
23023 VkPipeline pipe;
23024 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23025
23026 m_errorMonitor->VerifyNotFound();
23027
23028 if (err == VK_SUCCESS) {
23029 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23030 }
23031
23032 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23033 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23034}
23035
Tony Barbour3ed87a02017-03-15 16:19:02 -060023036TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023037 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23038
Tony Barbour3ed87a02017-03-15 16:19:02 -060023039 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023040 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023041
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023042 // Ensure that extension is available and enabled.
23043 uint32_t extension_count = 0;
23044 bool supports_maintenance1_extension = false;
23045 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23046 ASSERT_VK_SUCCESS(err);
23047 if (extension_count > 0) {
23048 std::vector<VkExtensionProperties> available_extensions(extension_count);
23049
23050 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23051 ASSERT_VK_SUCCESS(err);
23052 for (const auto &extension_props : available_extensions) {
23053 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23054 supports_maintenance1_extension = true;
23055 }
23056 }
23057 }
23058
23059 // Proceed if extension is supported by hardware
23060 if (!supports_maintenance1_extension) {
23061 printf(" Maintenance1 Extension not supported, skipping tests\n");
23062 return;
23063 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023064
23065 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023066 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023067 VkCommandBuffer cmd_buf;
23068 VkCommandBufferAllocateInfo alloc_info;
23069 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23070 alloc_info.pNext = NULL;
23071 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023072 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023073 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23074 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23075
23076 VkCommandBufferBeginInfo cb_binfo;
23077 cb_binfo.pNext = NULL;
23078 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23079 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23080 cb_binfo.flags = 0;
23081 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23082 // Set Negative height, should give error if Maintenance 1 is not enabled
23083 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23084 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23085 vkEndCommandBuffer(cmd_buf);
23086
23087 m_errorMonitor->VerifyNotFound();
23088}
23089
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023090TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23091 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23092
23093 ASSERT_NO_FATAL_FAILURE(Init());
23094
23095 uint32_t extension_count = 0;
23096 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23097 ASSERT_VK_SUCCESS(err);
23098
23099 if (extension_count > 0) {
23100 std::vector<VkExtensionProperties> available_extensions(extension_count);
23101 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23102 ASSERT_VK_SUCCESS(err);
23103
23104 for (const auto &extension_props : available_extensions) {
23105 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23106 // Create two pNext structures which by themselves would be valid
23107 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23108 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23109 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23110 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
23111 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23112
23113 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23114 dedicated_buffer_create_info_2.pNext = nullptr;
23115 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
23116
23117 uint32_t queue_family_index = 0;
23118 VkBufferCreateInfo buffer_create_info = {};
23119 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23120 buffer_create_info.pNext = &dedicated_buffer_create_info;
23121 buffer_create_info.size = 1024;
23122 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23123 buffer_create_info.queueFamilyIndexCount = 1;
23124 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23125
23126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
23127 VkBuffer buffer;
23128 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
23129 m_errorMonitor->VerifyFound();
23130 }
23131 }
23132 }
23133}
23134
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023135TEST_F(VkPositiveLayerTest, ValidStructPNext) {
23136 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
23137
Tony Barbour1fa09702017-03-16 12:09:08 -060023138 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023139
23140 // Positive test to check parameter_validation and unique_objects support
23141 // for NV_dedicated_allocation
23142 uint32_t extension_count = 0;
23143 bool supports_nv_dedicated_allocation = false;
23144 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23145 ASSERT_VK_SUCCESS(err);
23146
23147 if (extension_count > 0) {
23148 std::vector<VkExtensionProperties> available_extensions(extension_count);
23149
23150 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23151 ASSERT_VK_SUCCESS(err);
23152
23153 for (const auto &extension_props : available_extensions) {
23154 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23155 supports_nv_dedicated_allocation = true;
23156 }
23157 }
23158 }
23159
23160 if (supports_nv_dedicated_allocation) {
23161 m_errorMonitor->ExpectSuccess();
23162
23163 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23164 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23165 dedicated_buffer_create_info.pNext = nullptr;
23166 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23167
23168 uint32_t queue_family_index = 0;
23169 VkBufferCreateInfo buffer_create_info = {};
23170 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23171 buffer_create_info.pNext = &dedicated_buffer_create_info;
23172 buffer_create_info.size = 1024;
23173 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23174 buffer_create_info.queueFamilyIndexCount = 1;
23175 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23176
23177 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070023178 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023179 ASSERT_VK_SUCCESS(err);
23180
23181 VkMemoryRequirements memory_reqs;
23182 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
23183
23184 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
23185 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
23186 dedicated_memory_info.pNext = nullptr;
23187 dedicated_memory_info.buffer = buffer;
23188 dedicated_memory_info.image = VK_NULL_HANDLE;
23189
23190 VkMemoryAllocateInfo memory_info = {};
23191 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
23192 memory_info.pNext = &dedicated_memory_info;
23193 memory_info.allocationSize = memory_reqs.size;
23194
23195 bool pass;
23196 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
23197 ASSERT_TRUE(pass);
23198
23199 VkDeviceMemory buffer_memory;
23200 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
23201 ASSERT_VK_SUCCESS(err);
23202
23203 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
23204 ASSERT_VK_SUCCESS(err);
23205
23206 vkDestroyBuffer(m_device->device(), buffer, NULL);
23207 vkFreeMemory(m_device->device(), buffer_memory, NULL);
23208
23209 m_errorMonitor->VerifyNotFound();
23210 }
23211}
23212
23213TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
23214 VkResult err;
23215
23216 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
23217
Tony Barbour1fa09702017-03-16 12:09:08 -060023218 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023219 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23220
23221 std::vector<const char *> device_extension_names;
23222 auto features = m_device->phy().features();
23223 // Artificially disable support for non-solid fill modes
23224 features.fillModeNonSolid = false;
23225 // The sacrificial device object
23226 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
23227
23228 VkRenderpassObj render_pass(&test_device);
23229
23230 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
23231 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
23232 pipeline_layout_ci.setLayoutCount = 0;
23233 pipeline_layout_ci.pSetLayouts = NULL;
23234
23235 VkPipelineLayout pipeline_layout;
23236 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
23237 ASSERT_VK_SUCCESS(err);
23238
23239 VkPipelineRasterizationStateCreateInfo rs_ci = {};
23240 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
23241 rs_ci.pNext = nullptr;
23242 rs_ci.lineWidth = 1.0f;
23243 rs_ci.rasterizerDiscardEnable = true;
23244
23245 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
23246 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23247
23248 // Set polygonMode=FILL. No error is expected
23249 m_errorMonitor->ExpectSuccess();
23250 {
23251 VkPipelineObj pipe(&test_device);
23252 pipe.AddShader(&vs);
23253 pipe.AddShader(&fs);
23254 pipe.AddColorAttachment();
23255 // Set polygonMode to a good value
23256 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23257 pipe.SetRasterization(&rs_ci);
23258 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23259 }
23260 m_errorMonitor->VerifyNotFound();
23261
23262 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23263}
23264
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023265#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023266TEST_F(VkPositiveLayerTest, LongFenceChain)
23267{
23268 m_errorMonitor->ExpectSuccess();
23269
Tony Barbour1fa09702017-03-16 12:09:08 -060023270 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023271 VkResult err;
23272
23273 std::vector<VkFence> fences;
23274
23275 const int chainLength = 32768;
23276
23277 for (int i = 0; i < chainLength; i++) {
23278 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23279 VkFence fence;
23280 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23281 ASSERT_VK_SUCCESS(err);
23282
23283 fences.push_back(fence);
23284
23285 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23286 0, nullptr, 0, nullptr };
23287 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23288 ASSERT_VK_SUCCESS(err);
23289
23290 }
23291
23292 // BOOM, stack overflow.
23293 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23294
23295 for (auto fence : fences)
23296 vkDestroyFence(m_device->device(), fence, nullptr);
23297
23298 m_errorMonitor->VerifyNotFound();
23299}
23300#endif
23301
Cody Northrop1242dfd2016-07-13 17:24:59 -060023302#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060023303const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023304static bool initialized = false;
23305static bool active = false;
23306
23307// Convert Intents to argv
23308// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023309std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023310 std::vector<std::string> args;
23311 JavaVM &vm = *app.activity->vm;
23312 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023313 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023314
23315 JNIEnv &env = *p_env;
23316 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023317 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023318 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023319 jmethodID get_string_extra_method =
23320 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023321 jvalue get_string_extra_args;
23322 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023323 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023324
23325 std::string args_str;
23326 if (extra_str) {
23327 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23328 args_str = extra_utf;
23329 env.ReleaseStringUTFChars(extra_str, extra_utf);
23330 env.DeleteLocalRef(extra_str);
23331 }
23332
23333 env.DeleteLocalRef(get_string_extra_args.l);
23334 env.DeleteLocalRef(intent);
23335 vm.DetachCurrentThread();
23336
23337 // split args_str
23338 std::stringstream ss(args_str);
23339 std::string arg;
23340 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023341 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023342 }
23343
23344 return args;
23345}
23346
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023347void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
23348 const char *const type_param = test_info.type_param();
23349 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060023350
23351 if (type_param != NULL || value_param != NULL) {
23352 error_message.append(", where ");
23353 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023354 error_message.append("TypeParam = ").append(type_param);
23355 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060023356 }
23357 if (value_param != NULL) {
23358 error_message.append("GetParam() = ").append(value_param);
23359 }
23360 }
23361}
23362
23363// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
23364class LogcatPrinter : public ::testing::EmptyTestEventListener {
23365 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023366 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023367 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
23368 }
23369
23370 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023371 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060023372 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023373 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060023374
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023375 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
23376 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060023377 }
23378
23379 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023380 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023381 std::string result;
23382 if (info.result()->Passed()) {
23383 result.append("[ OK ]");
23384 } else {
23385 result.append("[ FAILED ]");
23386 }
23387 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023388 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060023389
23390 if (::testing::GTEST_FLAG(print_time)) {
23391 std::ostringstream os;
23392 os << info.result()->elapsed_time();
23393 result.append(" (").append(os.str()).append(" ms)");
23394 }
23395
23396 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
23397 };
23398};
23399
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023400static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023401
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023402static void processCommand(struct android_app *app, int32_t cmd) {
23403 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023404 case APP_CMD_INIT_WINDOW: {
23405 if (app->window) {
23406 initialized = true;
23407 }
23408 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023409 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023410 case APP_CMD_GAINED_FOCUS: {
23411 active = true;
23412 break;
23413 }
23414 case APP_CMD_LOST_FOCUS: {
23415 active = false;
23416 break;
23417 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023418 }
23419}
23420
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023421void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023422 app_dummy();
23423
Cody Northrop1242dfd2016-07-13 17:24:59 -060023424 int vulkanSupport = InitVulkan();
23425 if (vulkanSupport == 0) {
23426 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23427 return;
23428 }
23429
23430 app->onAppCmd = processCommand;
23431 app->onInputEvent = processInput;
23432
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023433 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023434 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023435 struct android_poll_source *source;
23436 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023437 if (source) {
23438 source->process(app, source);
23439 }
23440
23441 if (app->destroyRequested != 0) {
23442 VkTestFramework::Finish();
23443 return;
23444 }
23445 }
23446
23447 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023448 // Use the following key to send arguments to gtest, i.e.
23449 // --es args "--gtest_filter=-VkLayerTest.foo"
23450 const char key[] = "args";
23451 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023452
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023453 std::string filter = "";
23454 if (args.size() > 0) {
23455 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23456 filter += args[0];
23457 } else {
23458 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23459 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023460
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023461 int argc = 2;
23462 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23463 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023464
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023465 // Route output to files until we can override the gtest output
23466 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23467 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023468
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023469 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060023470
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023471 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060023472 listeners.Append(new LogcatPrinter);
23473
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023474 VkTestFramework::InitArgs(&argc, argv);
23475 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023476
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023477 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023478
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023479 if (result != 0) {
23480 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23481 } else {
23482 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23483 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023484
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023485 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023486
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023487 fclose(stdout);
23488 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023489
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023490 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023491 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023492 }
23493 }
23494}
23495#endif
23496
Tony Barbour300a6082015-04-07 13:44:53 -060023497int main(int argc, char **argv) {
23498 int result;
23499
Cody Northrop8e54a402016-03-08 22:25:52 -070023500#ifdef ANDROID
23501 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023502 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023503#endif
23504
Tony Barbour300a6082015-04-07 13:44:53 -060023505 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023506 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023507
23508 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23509
23510 result = RUN_ALL_TESTS();
23511
Tony Barbour6918cd52015-04-09 12:58:51 -060023512 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023513 return result;
23514}